Adapter notifyDataSetChanged()无法刷新

在使用ListView需要动态刷新数据的时候,经常会用到notifyDataSetChanged()函数。
以下为两个使用的错误实例:

1、
无法刷新:

private List<RecentItem> recentItems; 
......
recentItems = getData()         
mAdapter.notifyDataSetChanged();

正常刷新:

private List<RecentItem> recentItems; 
......
recentItems.clear();
recentItems.addAll(getData); 
mAdapter.notifyDataSetChanged();

原因:
mAdapter通过构造函数获取List a的内容,内部保存为List b;此时,a与b包含相同的引用,他们指向相同的对象。
但是在语句recentItems = getData()之后,List a会指向一个新的对象。而mAdapter保存的List b仍然指向原来的对象,该对象的数据也并没有发生改变,所以Listview并不会更新。

2、
我在页面A中绑定了数据库的数据,在页面B中修改了数据库中的数据,希望在返回页面A时,ListView刷新显示。
无法刷新:

protected void onResume() {
mAdapter.notifyDataSetChanged();
super.onResume();
}

正常刷新:

protected void onResume() {
recentItems.clear();
recentItems.addAll(recentDB.getRecentList());
mAdapter.notifyDataSetChanged();
super.onResume();
}

原因:
mAdapter内部的List指向的是内存中的对象,而不是数据库。所以改变数据库中的数据,并不会影响该对象。

void notifyDataSetChanged()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,242评论 25 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,510评论 0 17
  • 简介 在Android开发中ListView是比较常用的组件。 以列表的形式展示具体内容。 并且能够根据数据的长度...
    上善若水Ryder阅读 7,000评论 2 5
  • 我是骨子里透着小气的一种人,这种小气,让我受伤很大; 因为小气,不愿意投入,总想从精神方面的免费投入来获取肉体的充...
    真实思考阅读 994评论 0 51
  • 1 上大学时,我们班有一对关系特别好的朋友,好的恨不得每天都在一起。 她们每天一起早晨打卡,一起去上课,然后中午吃...
    公子凉阅读 728评论 0 2