すでに似た質問が出されていることは知っていますが、リストビューを更新するには明確な答えはないようです。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" />
ありがとうございました。私は最後のコマンドを紛失していましたが、私のコードを乱す別の行も見つかりました。 私はthis.recreate()を持っていました。同じ方法で画面をリフレッシュします。 これは、それを入力した直後にリストビューをクリアしていました。 – EtienneSW