registerDataSetObserver:浅析Andorid ListView和Adapte
最近由于遇到将内容分部绑定到ListView里的需求,追踪源码之后对ListView和Adapter有了点肤浅的认识,在此与大家分享。
这里用到了观察者模式,在ListView的setAdapter里注册一个AdapterDataSetObserver观察者。
- public void setAdapter(ListAdapter adapter) {
- ........
- mDataSetObserver = new AdapterDataSetObserver();//AdapterDataSetObserver是ListView的基类AdapterView的内部类
- mAdapter.registerDataSetObserver(mDataSetObserver);//注册一个观察者
- .........
- requestLayout();//更新视图
- }
ListAdapter是一接口,BaseAdapter继承了它
- public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
- private final DataSetObservable mDataSetObservable = new DataSetObservable();
- public boolean hasStableIds() {
- return false;
- }
- public void registerDataSetObserver(DataSetObserver observer) {
- mDataSetObservable.registerObserver(observer);
- }
- public void unregisterDataSetObserver(DataSetObserver observer) {
- mDataSetObservable.unregisterObserver(observer);
- }
- /**
- * 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();
- }
- /**
- * Notifies the attached observers that the underlying data is no longer valid
- * or available. Once invoked this adapter is no longer valid and should
- * not report further data set changes.
- */
- public void notifyDataSetInvalidated() {
- mDataSetObservable.notifyInvalidated();
- }
- public boolean areAllItemsEnabled() {
- return true;
- }
- public boolean isEnabled(int position) {
- return true;
- }
- public View getDropDownView(int position, View convertView, ViewGroup parent) {
- return getView(position, convertView, parent);
- }
- public int getItemViewType(int position) {
- return 0;
- }
- public int getViewTypeCount() {
- return 1;
- }
- public boolean isEmpty() {
- return getCount() == 0;
- }
- }
DataSetObservable定义如下:
- public class DataSetObservable extends Observable<DataSetObserver> {
- public void notifyChanged() {//通知每个观察者数据已变化
- synchronized(mObservers) {
- for (DataSetObserver observer : mObservers) {
- observer.onChanged();
- }
- }
- }
- public void notifyInvalidated() {
- synchronized (mObservers) {
- for (DataSetObserver observer : mObservers) {
- observer.onInvalidated();
- }
- }
- }
- }
ListView里注册的观察者是AdapterDataSetObserver对象,其定义如下:
- class AdapterDataSetObserver extends DataSetObserver {
- private Parcelable mInstanceState = null;
- @Override
- public void onChanged() {
- mDataChanged = true;
- mOldItemCount = mItemCount;
- mItemCount = getAdapter().getCount();//Adapter现有元素个数
- if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
- && mOldItemCount == 0 && mItemCount > 0) {
- AdapterView.this.onRestoreInstanceState(mInstanceState);
- mInstanceState = null;
- } else {
- rememberSyncState();
- }
- checkFocus();
- requestLayout();//更新视图
- }
- .................
- }
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相关推荐
- Andorid ListView使用技巧
一.使用ViewHolder模式提高效率 ViewHolder模式充分利用ListView的视图缓存机制,避免了每次在调用getView()方法的时候都去通过findViewById()方法实例化控件 ...
- Listview and Adapte
一.XML代码 1.<ListViewandroid:layout_width="match_parent" android:layout_height="matc ...
- 仿新闻类实现滑动选择标签(一)
文章界面,可以上拉下拉刷新数据,并且可以加载标签布局,通过viewpager实现滑动,改造PagerSlidingTabStrip实现修改字体颜色,底部横线宽度与字体宽度一致 直接附代码 实现文章页面 ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerView是谷歌官方出的一 ...
- 【Andorid X 项目笔记】禁用ListView的Fling功能(1)
前言 新的项目正在紧张开发中,初步估计2个月时间开发完成第一版,我负责Android端开发,由于不便过早公布,本系列将命名为"X项目笔记",并于项目结束后最终公布名称.本系列主要记 ...
- android文件管理器listview,浅析Android文件管理器(项目一)
文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能, ...
- Android ListView与RecyclerView对比浅析
前言 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活. 弄清楚RecyclerView是否有足够的吸引力替换掉ListView, ...
- Andorid开机自动锁频浅析 - 默认开机不锁屏
直接给个结论: 在没有密码的情况下默认不使用滑动解锁屏 Set default lockscreen disabled diff --git a/packages/SettingsProvider/r ...
- 横向ListView(一) ——开篇,基础逻辑实现
2019独角兽企业重金招聘Python工程师标准>>> 第一次写博文,写得不好的地方还望各位看客见谅 为了学习自定义软件开发,且定制出满足自己需求的控件(不需要将就地使用第三方源码) ...
最新文章
- 漫画:什么是 “抽象工厂模式” ?
- 加州大学新算法:让智能汽车更精准检测行人
- 008_setting指令
- java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子
- 安装python缺少dll_Microsoft.PythonTools.dll
- AKKA 笔记 - 有限状态机 -2
- ubuntu kylin mysql_Ubuntu16.04下Kylin的安装与配置
- 风险管理那些事:当你身边有头“熊
- ssm欢欢宠物医院管理系统的设计与实现毕业设计源码171734
- 关于人工智能的一些幻想
- 【寻找最佳小程序】01期:影视评分小工具“豆瓣评分”——产品设计要点及专家评析
- 模拟退火MATLAB
- 抖竹官网下载代理加盟有哪些盈利点?摆烂后短视频引流拓客软件
- VB程序中的反三角函数
- 易语言删除首尾空白符代码
- 使用python pip安装PyQt5时遇到的不能安装d3dcompiler_47.dll错误
- java虚拟机 (JVM)
- Cilium 1.11 发布,带来内核级服务网格、拓扑感知路由....
- 《数学之美(第一版)》笔记整理 —— 目录
- 股票macd计算公式php,股票技术指标分析(MA\KDJ\MACD)