最近由于遇到将内容分部绑定到ListView里的需求,追踪源码之后对ListView和Adapter有了点肤浅的认识,在此与大家分享。

这里用到了观察者模式,在ListView的setAdapter里注册一个AdapterDataSetObserver观察者。

  1. public void setAdapter(ListAdapter adapter) {
  2. ........
  3. mDataSetObserver = new AdapterDataSetObserver();//AdapterDataSetObserver是ListView的基类AdapterView的内部类
  4. mAdapter.registerDataSetObserver(mDataSetObserver);//注册一个观察者
  5. .........
  6. requestLayout();//更新视图
  7. }

ListAdapter是一接口,BaseAdapter继承了它

  1. public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
  2. private final DataSetObservable mDataSetObservable = new DataSetObservable();
  3. public boolean hasStableIds() {
  4. return false;
  5. }
  6. public void registerDataSetObserver(DataSetObserver observer) {
  7. mDataSetObservable.registerObserver(observer);
  8. }
  9. public void unregisterDataSetObserver(DataSetObserver observer) {
  10. mDataSetObservable.unregisterObserver(observer);
  11. }
  12. /**
  13. * Notifies the attached observers that the underlying data has been changed
  14. * and any View reflecting the data set should refresh itself.
  15. */
  16. public void notifyDataSetChanged() {
  17. mDataSetObservable.notifyChanged();
  18. }
  19. /**
  20. * Notifies the attached observers that the underlying data is no longer valid
  21. * or available. Once invoked this adapter is no longer valid and should
  22. * not report further data set changes.
  23. */
  24. public void notifyDataSetInvalidated() {
  25. mDataSetObservable.notifyInvalidated();
  26. }
  27. public boolean areAllItemsEnabled() {
  28. return true;
  29. }
  30. public boolean isEnabled(int position) {
  31. return true;
  32. }
  33. public View getDropDownView(int position, View convertView, ViewGroup parent) {
  34. return getView(position, convertView, parent);
  35. }
  36. public int getItemViewType(int position) {
  37. return 0;
  38. }
  39. public int getViewTypeCount() {
  40. return 1;
  41. }
  42. public boolean isEmpty() {
  43. return getCount() == 0;
  44. }
  45. }

DataSetObservable定义如下:

  1. public class DataSetObservable extends Observable<DataSetObserver> {
  2. public void notifyChanged() {//通知每个观察者数据已变化
  3. synchronized(mObservers) {
  4. for (DataSetObserver observer : mObservers) {
  5. observer.onChanged();
  6. }
  7. }
  8. }
  9. public void notifyInvalidated() {
  10. synchronized (mObservers) {
  11. for (DataSetObserver observer : mObservers) {
  12. observer.onInvalidated();
  13. }
  14. }
  15. }
  16. }

ListView里注册的观察者是AdapterDataSetObserver对象,其定义如下:

  1. class AdapterDataSetObserver extends DataSetObserver {
  2. private Parcelable mInstanceState = null;
  3. @Override
  4. public void onChanged() {
  5. mDataChanged = true;
  6. mOldItemCount = mItemCount;
  7. mItemCount = getAdapter().getCount();//Adapter现有元素个数
  8. if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
  9. && mOldItemCount == 0 && mItemCount > 0) {
  10. AdapterView.this.onRestoreInstanceState(mInstanceState);
  11. mInstanceState = null;
  12. } else {
  13. rememberSyncState();
  14. }
  15. checkFocus();
  16. requestLayout();//更新视图
  17. }
  18. .................
  19. }

AdapterDataSetObserver里的具体实现我没弄清楚,但感觉是在这里更新了ListView显示的数据,ListView里是怎样更新的没弄清楚,希望哪位高手知道的告诉我。

但是如果只在ListView里显示Adapter的部分数据,该怎么弄呢,可继承BaseAdapter,实现BaseAdapter里未实现的如下方法:

getCount()、getItem(int position)、getItemId(int position)、getView(int position, View convertView, ViewGroup parent)。

只需在getCount里返回想要的大小就行了。

转载于:https://www.cnblogs.com/feng9exe/p/9253704.html

registerDataSetObserver:浅析Andorid ListView和Adapte相关推荐

  1. Andorid ListView使用技巧

    一.使用ViewHolder模式提高效率 ViewHolder模式充分利用ListView的视图缓存机制,避免了每次在调用getView()方法的时候都去通过findViewById()方法实例化控件 ...

  2. Listview and Adapte

    一.XML代码 1.<ListViewandroid:layout_width="match_parent" android:layout_height="matc ...

  3. 仿新闻类实现滑动选择标签(一)

    文章界面,可以上拉下拉刷新数据,并且可以加载标签布局,通过viewpager实现滑动,改造PagerSlidingTabStrip实现修改字体颜色,底部横线宽度与字体宽度一致 直接附代码 实现文章页面 ...

  4. 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerView是谷歌官方出的一 ...

  5. 【Andorid X 项目笔记】禁用ListView的Fling功能(1)

    前言 新的项目正在紧张开发中,初步估计2个月时间开发完成第一版,我负责Android端开发,由于不便过早公布,本系列将命名为"X项目笔记",并于项目结束后最终公布名称.本系列主要记 ...

  6. android文件管理器listview,浅析Android文件管理器(项目一)

    文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能, ...

  7. Android ListView与RecyclerView对比浅析

    前言 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活. 弄清楚RecyclerView是否有足够的吸引力替换掉ListView, ...

  8. Andorid开机自动锁频浅析 - 默认开机不锁屏

    直接给个结论: 在没有密码的情况下默认不使用滑动解锁屏 Set default lockscreen disabled diff --git a/packages/SettingsProvider/r ...

  9. 横向ListView(一) ——开篇,基础逻辑实现

    2019独角兽企业重金招聘Python工程师标准>>> 第一次写博文,写得不好的地方还望各位看客见谅 为了学习自定义软件开发,且定制出满足自己需求的控件(不需要将就地使用第三方源码) ...

最新文章

  1. 漫画:什么是 “抽象工厂模式” ?
  2. 加州大学新算法:让智能汽车更精准检测行人
  3. 008_setting指令
  4. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
  5. 安装python缺少dll_Microsoft.PythonTools.dll
  6. AKKA 笔记 - 有限状态机 -2
  7. ubuntu kylin mysql_Ubuntu16.04下Kylin的安装与配置
  8. 风险管理那些事:当你身边有头“熊
  9. ssm欢欢宠物医院管理系统的设计与实现毕业设计源码171734
  10. 关于人工智能的一些幻想
  11. 【寻找最佳小程序】01期:影视评分小工具“豆瓣评分”——产品设计要点及专家评析
  12. 模拟退火MATLAB
  13. 抖竹官网下载代理加盟有哪些盈利点?摆烂后短视频引流拓客软件
  14. VB程序中的反三角函数
  15. 易语言删除首尾空白符代码
  16. 使用python pip安装PyQt5时遇到的不能安装d3dcompiler_47.dll错误
  17. java虚拟机 (JVM)
  18. Cilium 1.11 发布,带来内核级服务网格、拓扑感知路由....
  19. 《数学之美(第一版)》笔记整理 —— 目录
  20. 股票macd计算公式php,股票技术指标分析(MA\KDJ\MACD)

热门文章

  1. PyQt5实现简易音乐播放器
  2. C/C++面向对象编程之多态
  3. 每日学术速递4.13
  4. Currency 2 大写
  5. 笔记本电脑放久了开机进不去怎么办?这个方法教你一键搞定!你也可以成为电脑高手!
  6. 思科路由模拟器 -- (3)RIP协议及配置
  7. 【课程笔记】程序设计模式复习笔记
  8. 苹果开发者账号持有人转让地址认证失败
  9. 上手机器学习系列-第1篇-聊聊机器学习的正确打开姿势
  10. 红帽8.5---yum源安装与配置