notifydatasetchanged

1月前发布

Android中,通常在列表中添加、删除或者是修改数据,notifyDataSetChanged()可以在适配器绑定的数组后,不用重新刷新Activity,通知Activity的适配器更新列表的数据即可。常用的列表指的是listview、recycleview。

必须要强调的就是notifyDataSetChanged必须是列表和适配器都初始化好了之后。

notifyDataSetChanged()会记住你划到的位置,重新加载数据的时候不会改变位置,只是改变了数据;而用notifyDataSetInvalidated()时,数据改变的同时,自动滑到顶部第0条的位置.

废话不多讲,直接上代码演示,举个简单的例子:

ListView lv;//列表

ArrayAdapter<String> Adapter;//适配器

ArrayList<String> arr=new ArrayList<String>();//适配器数据

当数据发生改变的时候:

arr.add("增加一个条目");//增加一项

Adapter.notifyDataSetChanged();//通知适配器数据更新了

通知适配器数据更新的操作可以在主线程里面,也可以在分线程中。也可以在异步任务AsyncTask的doInBackground、onPostExecute方法中调用该方法。

使用notifyDataSetChanged的时候常常会碰到列表不刷新的情况,问题出在哪里?

问题就在于适配器指向的数据是不是同一个数据,同一个内存地址。

我们看下notifyDataSetChanged源码的实现:

public final void notifyDataSetChanged() { mObservable.notifyChanged(); }观察者模式实现,数据改变了,通知观察者刷新。如果不刷新了,有几个地方有可能出现问题:

1:数据地址变了,不是同一个对象

在数据A上注册了观察者,后面我们更改了数据B,然后调用了notify,此时调用notifyDataSetChanged方法列表是可能存在不更新的问题的。

通常的解决方法如下:

list.clear();

list.addAll(data);

notifyDataSetChanged;

再不行的话只能用万能的解决方法:重新设置适配器和数据了

好了,今天的分享就到这里。

举报/反馈
© 版权声明
THE END
喜欢就支持以下吧
点赞0 分享
评论 抢沙发

请登录后发表评论