我有一个由 SimpleAdapter 填充的 ListView,它从 HashMaps 的 ArrayList 中获取值。arraylist 是由一种load()
从我的站点获取数据的方法构建的。我有一个菜单选项,允许通过再次获取数据并调用来刷新数据,adapter.notifyDataSetChanged()
它实际上工作正常,更新数组列表并刷新 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);
}
}