HashMaps の ArrayList から値を取得する SimpleAdapter によって設定された ListView があります。arraylist はload()
、私のサイトからデータをフェッチするメソッドによって構築されます。データを再度取得して呼び出すことでデータを更新できるメニューオプションがadapter.notifyDataSetChanged()
あり、実際には正常に動作し、arraylist を更新し、ListView も更新します。ここで、http 接続を確立してデータを取得するのに数秒かかるload()
ため、進行中のプロセスをユーザーに通知するために ProgressDialog を設定したいと考えました。ProgressDialog を UI スレッドに配置できないことはわかっています。load()
動作するので、AsyncTask で試しました。新しいデータがフェッチされてアダプターに渡されている間にダイアログを表示して正常に動作しますが、問題も追加されます。変更されたリスト項目を画面からスクロールしてスクロールしない限り、ListView は表示された項目を更新しません。戻ると、新しいコンテンツが表示されます。ProgressDialog とリストの内容の更新の両方を行うにはどうすればよいですか?
これは、AsyncTask で ProgressDialog を使用したコードです (データを編集しますが、画面上でリストの更新をトリガーしません)。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.update: {
loading.show(); //the ProgressDialog
AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
load(); //fetching data, takes a while
return null;
}
@Override
protected void onPostExecute(Void result) {
loading.dismiss();
}
};
loadingTask.execute();
adapter.notifyDataSetChanged();
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
これは、ListView と背後のデータを更新するコードです (ただし、ProgressDialog を設定することはできません)。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.update: {
load();
adapter.notifyDataSetChanged();
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}