Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 适配器上的notifyDataSetChanged()不更新listview,为什么?_Android_Listview_Listactivity_Notify_Baseadapter - Fatal编程技术网

Android 适配器上的notifyDataSetChanged()不更新listview,为什么?

Android 适配器上的notifyDataSetChanged()不更新listview,为什么?,android,listview,listactivity,notify,baseadapter,Android,Listview,Listactivity,Notify,Baseadapter,我有一个扩展listactivity的活动,在这个类中扩展我有一个扩展baseadapter的类 现在在我的listactivity中有一个onCreate /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapte

我有一个扩展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();
}
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setListAdapter(新建BuildingAdapter(本));
最终ProgressDialog加载=新ProgressDialog(本);
加载.setProgressStyle(ProgressDialog.STYLE\u微调器);
加载。设置标题(“Laddar”);
正在加载.setMessage(“Hämtar data från servern”);
loading.show();
新建异步任务()
{
@凌驾
受保护的数据包。数据doInBackground(无效…参数){
返回ServerConnection.getBuildings();
}
@凌驾
受保护的void onPostExecute(DataPacket.Data参数){
((MainanceApplication)getApplication()).setDataStructure(参数);
loading.dispose();
//((BuildingAdapter)getListAdapter()).notifyDataSetChanged();
setListAdapter(newbuildingAdapter(BuildingSelectionActivity.this));
}
}.execute();
}
这是应该的,但我的问题是在onPostExecute中,我更新列表适配器使用的数据结构。 为什么我不能直接打电话给notifyDataSetChanged


如果我有那一行,视图不会自动更新,但是如果我使用我在哪里设置ListAdapter下的那一行,它就可以正常工作。

您是否尝试过使用一个而不是一个AsyncTask来完成此任务。这种东西就是专门为你设计的。请注意,即使加载程序在API-10之前不可用,您仍然可以通过android从API-4及更高版本轻松访问它们。

您可以更新UI的唯一位置是
onProgressUpdate(…)。从您的
doInBackground(…)
,调用
publishProgress(…)

如果适配器已设置,再次设置它将不会刷新listview。而是首先检查listview是否有适配器,然后调用适当的方法

我认为在设置列表视图时创建适配器的新实例不是一个好主意。而是创建一个对象

BuildingAdapter adapter = new BuildingAdapter(context);

    if(getListView().getAdapter() == null){ //Adapter not set yet.
     setListAdapter(adapter);
    }
    else{ //Already has an adapter
    adapter.notifyDataSetChanged();
    }

最好放一段代码,说明如何使用notifyDataSetChanged()更新列表。