我有一个扩展listactivity的活动,在这个类中扩展我有一个扩展baseadapter的类。
现在在我的listactivity中我有这个onCreate
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new BuildingAdapter(this));
final ProgressDialog loading = new ProgressDialog(this);
loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);
loading.setTitle("Laddar");
loading.setMessage("Hämtar data från servern");
loading.show();
new AsyncTask<Void, Void, DataPacket.Data>()
{
@Override
protected DataPacket.Data doInBackground(Void... params){
return ServerConnection.getBuildings();
}
@Override
protected void onPostExecute(DataPacket.Data param) {
((MainenanceApplication)getApplication()).setDataStructure(param);
loading.dismiss();
//((BuildingAdapter)getListAdapter()).notifyDataSetChanged();
setListAdapter(new BuildingAdapter(BuildingSelectionActivity.this));
}
}.execute();
}
这可以正常工作,但我的问题是onPostExecute我更新了列表适配器使用的数据结构。 为什么我不能只调用notifyDataSetChanged ??
如果我有那行,那么视图不会自动更新,但是如果我使用setListAdapter所在的行,那么一切都有效。
答案 0 :(得分:1)
您是否尝试使用AsyncTaskLoader代替AsyncTask。 Loaders正是为此设计的那种东西。请注意,即使装载程序在API-10之前不可用,您仍然可以通过API-4及更高版本的Android Support Pacakge轻松访问它们。
答案 1 :(得分:1)
如果已设置适配器,则再次进行设置将不会刷新列表视图。而是首先检查listview是否有适配器,然后调用适当的方法。
我认为在设置列表视图时创建适配器的新实例并不是一个好主意。相反,创建一个对象。
BuildingAdapter adapter = new BuildingAdapter(context);
if(getListView().getAdapter() == null){ //Adapter not set yet.
setListAdapter(adapter);
}
else{ //Already has an adapter
adapter.notifyDataSetChanged();
}
答案 2 :(得分:0)
您可以更新用户界面的唯一位置是onProgressUpdate(...);
。在doInBackground(...)
,致电publishProgress(...)
。