notifyDataSetChanged对RecyclerView失效?

今天在项目中发现怎么使用notifyDataSetChanged刷新数据都没用,千看百看,忽然灵感一来,记得以前也有这样的情况,赶紧记录在案以防我的笨脑瓜子又忘了。

关键点:notifyDataSetChanged只负责对你第一次设置的数据源进行“监听”。假如在中途你的数据源地址(引用)发生了改变,再去调用notifyDataSetChanged将不会生效。

错误使用场景(逻辑)

/*createNewData返回新生成的数据数组*/
ArrayList<String> createNewData() {
    ArrayList<String> newData = new ArrayList<>();
    get data;
    return newData;
}
//...
ArrayList<String> mData;
//...
mData = createNewData();
mAdapter = new Adapter(mData);
mRecyclerView.setAdapter(mAdapter);

void onClick {
    updateData();
}

void updateData() {
    mData = createNewData();
    mAdapter.notifyDataSetChanged();
}

在上述情况下,当需要重新生成数据的时候,再次调用createNewData,notifyDataSetChanged是不可能起作用的。
因为mData的地址引用的list已经不是第一次传给Adapter的那个mData的引用了。

正确使用场景(逻辑)

/*createNewData返回新生成的数据数组*/
ArrayList<String> createNewData() {
    ArrayList<String> newData = new ArrayList<>();
    get data;
    return newData;
}
//...
ArrayList<String> mData;
//...
mData = new ArrayList<>();
mData.addAll(createNewData());
mAdapter = new Adapter(mData);
mRecyclerView.setAdapter(mAdapter);

void onClick {
    updateData();
}

void updateData() {
    mData.clear();
    mData.addAll(createNewData());
    mAdapter.notifyDataSetChanged();
}

而在这种情况下,因为mData的地址已经固定,只是对其内容进行增删,通过调用notifyDataSetChanged则可以判断mData是否发生了变化从而刷新UI。

DEMO

最后附上demo地址, 简单展现了这两种情况。

效果图

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,846评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,188评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • 瞧它多渺小 生长在阴暗的过道 瞧它多可笑 还想着让世人看到 它努力地往外靠 终于见到了光耀 可人们嘲笑它的丑陋 说...
    慵懒小兽阅读 201评论 0 0
  • 三年,挺久的了。大学刚毕业,因为自知见识少、要求不高能吃苦,所以毕业后有幸有了第一份与所学专业有关的工作,并没有毕...
    峰行2015阅读 1,228评论 0 2