2017-03-16 6 views
0

すでに似た質問が出されていることは知っていますが、リストビューを更新するには明確な答えはないようです。Aysntaskからlistviewを更新してadapter.addが動作しない

ArrayAdapterを使用してasynctask経由でUIのListviewを更新しようとしています。

アダプタに値を追加しようとしましたが、エラーは表示されませんが、リストビューが空のままであるため動作していないようです。

アダプタに直接配列を入力すると動作します。しかし、私は将来の発展のためにasynctaskを通じてこれをしたいと思っています。

以下のように進捗状況の更新を行うか、PostExecuteで行うべきかわかりません。

ここにコードがあります。

public class MainActivity extends AppCompatActivity { 

    ListView myList; 
    ArrayAdapter adapter; 
    private String[] names = {"Test1","Test2","Test3","Test4","Test5"}; 


    //MAIN METHOD TO START PROGRAM 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myList = (ListView) findViewById(R.id.listView); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); 
     myList.setAdapter(adapter); 


     new MyTask().execute(); 
    } 



    class MyTask extends AsyncTask<Void, String, String> { 

     ArrayAdapter<String> adapter; 


     @Override 
     protected void onPreExecute() { 
      System.out.println("PreExecute Method Triggered"); 
      adapter = (ArrayAdapter<String>)myList.getAdapter(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      for (String Name : names) 
      { 
       publishProgress(Name);      
      }    
      return "Values added"; 
     } 


     @Override 
     protected void onProgressUpdate(String... values) { 
      adapter.add(values[0]); 
      System.out.println("OnProgress Method Triggered = " + values[0]); 
     } 


     @Override 
     protected void onPostExecute(String result) { 
      System.out.println("PostExecute Method Triggered" + result); 
     } 
    } 

} 

は、ここでは、アダプタが基になるデータが変更されたためListViewを更新するために知らせる必要があり

<ListView 
     android:id="@+id/listView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/gradient_bg" /> 

答えて

0

私acivity_main.xmlの私のリストビューです。これを行うにはnotifydatasetchangedに電話する必要があります。 ArrayAdapterについては、documentationを参照してください。

addの後にadapter.notifydatasetchanged()を追加すると、onProgressUpdate()またはonPostExecute()になります。

+0

ありがとうございました。私は最後のコマンドを紛失していましたが、私のコードを乱す別の行も見つかりました。 私はthis.recreate()を持っていました。同じ方法で画面をリフレッシュします。 これは、それを入力した直後にリストビューをクリアしていました。 – EtienneSW

関連する問題