前言

相信很多人都遇到过需要在列表执行完notifydatasetchanged后再执行某些特定逻辑的需求,但都会遇到一些问题,在网上很多人说notifydatasetchanged是异步的,且没有监听方法什么的,真是这样吗?我们来分析一下。

notifydatasetchanged究竟做了什么?

相信大家都知道adapter是基于观察者模式实现的,那么notifydatasetchanged方法其实就是通知观察者数据改变了需要更新,看看源码。

    /*** Notifies the attached observers that the underlying data has been changed* and any View reflecting the data set should refresh itself.*/public void notifyDataSetChanged() {mDataSetObservable.notifyChanged();}

再看下mDataSetObservable.notifyChanged方法是干什么的

    /*** Invokes {@link DataSetObserver#onChanged} on each observer.* Called when the contents of the data set have changed.  The recipient* will obtain the new contents the next time it queries the data set.*/public void notifyChanged() {synchronized(mObservers) {// since onChanged() is implemented by the app, it could do anything, including// removing itself from {@link mObservers} - and that could cause problems if// an iterator is used on the ArrayList {@link mObservers}.// to avoid such problems, just march thru the list in the reverse order.for (int i = mObservers.size() - 1; i >= 0; i--) {mObservers.get(i).onChanged();}}}```
其实就是遍历观察者,并调用其onChanged方法。
到这里又有疑问,mDataSetObservable这个东西是干什么的,没有设置过啊?其实在listview设置adapter的时候,listview内部做了处理,看看setAdapter方法里的一个代码片段就知道了。
if (mAdapter != null) {mAreAllItemsSelectable = mAdapter.areAllItemsEnabled();mOldItemCount = mItemCount;mItemCount = mAdapter.getCount();checkFocus();mDataSetObserver = new AdapterDataSetObserver();mAdapter.registerDataSetObserver(mDataSetObserver);}

“`
我们再看看AdapterDataSetObserver的源码片段

public void onChanged() {mDataChanged = true;mOldItemCount = mItemCount;mItemCount = getAdapter().getCount();// Detect the case where a cursor that was previously// invalidated has// been repopulated with new data.if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null&& mOldItemCount == 0 && mItemCount > 0) {AdapterView.this.onRestoreInstanceState(mInstanceState);mInstanceState = null;} else {rememberSyncState();}checkFocus();requestLayout();}

看到这里应该就很明确了,实际上notifydatasetchanged方法是同步执行,但由于view重绘调用了requestLayout方法,requestLayout方法是异步的,所以会让人错误认为notifydatasetchanged方法是异步执行的。既然我们知道原因,那么就可以很好解决前言说的问题,只要在notifydatasetchanged方法后,将相关逻辑放到post里执行就可以了。

关于notifydatasetchange的一些理解相关推荐

  1. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  2. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  3. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  4. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  5. 智能文档理解:通用文档预训练模型

    预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战? 预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮.这和小孩子读书一样,一开始语文.数学.化学都学,读书.网上游戏等,在脑子 ...

  6. 熵,交叉熵,散度理解较为清晰

    20210511 https://blog.csdn.net/qq_35455503/article/details/105714287 交叉熵和散度 自己给自己编码肯定是最小的 其他的编码都会比这个 ...

  7. mapreduce理解_大数据

    map:对不同的数据进行同种操作 reduce:按keys 把数据规约到一起 看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop 与MapReduce的整体有所了解了. [前言 ...

  8. 文件句柄和文件描述符的区别和理解指针

    句柄是Windows用来标识被应用程序所建立或使用的对象的唯一整数,Windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.Windows句柄有点象C语言中的文件句柄. ...

  9. 通俗理解条件熵-数学

    就是决策树里面选划分属性用到的计算 条件熵越小表示划分之后各个集合越纯净 前面我们总结了信息熵的概念通俗理解信息熵 - 知乎专栏,这次我们来理解一下条件熵. 我们首先知道信息熵是考虑该随机变量的所有可 ...

最新文章

  1. 2019年上半年收集到的人工智能卷积神经网络干货文章
  2. deform_conv_cuda windows编译
  3. Cisco 设备设置监控口
  4. 系统间通信1:阻塞与非阻塞式通信A
  5. boost::sort模块实现整数排序与右移函子反向排序示例
  6. 微擎css使用php变量,$_Wamp;全局变量
  7. 阿里云前端周刊 - 第 26 期
  8. 日志服务器搭建及配置_[ELK入门到实践笔记] 一、通过rsyslog搭建集中日志服务器...
  9. Spring Cloud 中 分布式事务解决方案 -- 阿里GTS的使用
  10. Java 时间处理整理
  11. 几何画板中该如何插入公式
  12. 手机端开发(uni-app、vant、mui)优缺点分析
  13. scipy.linalg中kron的用法
  14. 每天15min-HTML5(10)-表单(上)
  15. 特定软件无法联网,nslookup无法解析任何地址,但是其他业务工作正常的故障...
  16. TI Sitara系列AM4376/AM4379 ARM Cortex-A9高性能低功耗处理器设计的工业级核心板
  17. 电源适配器的作用有哪些
  18. mapi java_使用 MAPI 实现邮件发送
  19. [开源工具]小鸟云虚拟主机+wordpress搭建个人博客(不喜勿喷)
  20. Excel 特殊分组汇总示例

热门文章

  1. 配置类不加@Configuration竟然也可以注册bean
  2. Linux下vim的复制、粘贴操作
  3. 注册【小程序】和注册页面
  4. dataTable 查询,重置
  5. 【润乾报表2018】如何为参数报表增加重置功能
  6. 网络文件共享服务之NFS
  7. uva10635 Prince and Princess
  8. Ning: 社会软件建造平台。
  9. 2021年中国吉他和低音放大器市场趋势报告、技术动态创新及2027年市场预测
  10. 关于MIDI键盘的服务对接