我的适配器上的 notifyDataSetChanged() 没有更新列表视图,为啥?

Posted

技术标签:

【中文标题】我的适配器上的 notifyDataSetChanged() 没有更新列表视图,为啥?【英文标题】:notifyDataSetChanged() on my adapter does not update the listview, why?我的适配器上的 notifyDataSetChanged() 没有更新列表视图,为什么? 【发布时间】:2011-12-16 17:00:32 【问题描述】:

我有一个扩展 listactivity 的活动,在这个类中扩展我有一个扩展 baseadapter 的类。

现在在我的列表活动中我有这个 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 下的行,则一切正常。

【问题讨论】:

最好将代码显示您如何使用 notifyDataSetChanged() 更新列表。 【参考方案1】:

如果适配器已经设置,再次设置它不会刷新列表视图。而是先检查列表视图是否有适配器,然后调用相应的方法。

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

BuildingAdapter adapter = new BuildingAdapter(context);

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

【讨论】:

【参考方案2】:

您是否尝试过为此使用 AsyncTaskLoader 而不是 AsyncTask。 Loaders 正是为这种东西而设计的。请注意,即使 Loaders 在 API-10 之前不可用,您仍然可以通过 API-4 及更高版本的 android Support Pacakge 轻松访问它们。

【讨论】:

【参考方案3】:

您可以更新 UI 的唯一位置是 onProgressUpdate(...);。从您的doInBackground(...) 拨打publishProgress(...)

【讨论】:

以上是关于我的适配器上的 notifyDataSetChanged() 没有更新列表视图,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 recyclerview 适配器上的空侦听器?

使用自定义身份验证适配器时检查 CakePHP 上的登录用户信息

带有 USB 适配器的笔记本电脑上的串行端口

如何避免可过滤适配器上的 notifyDataSetChanged?

自定义页面适配器上的空指针异常

根据活动(Android)更改自定义适配器上的布局文件