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里返回想要的大小就行了。
registerDataSetObserver:浅析Andorid ListView和Adapte的更多相关文章
- andorid ListView和GirdView 与ScrollView 冲突
1.listview解决方法 public static void setListViewHeightBasedOnChildren(ListView listView) { if(listView ...
- 从 ListView 到 RecyclerView 的用法浅析
文章目录 要走好明天的路,必须记住昨天走过的路,思索今天正在走着的路. ListView,一种在垂直滚动列表中显示条目的视图:RecyclerView,一种在局限的窗口呈现大数据集合的灵活视图.Rec ...
- 安卓高级2 swipeReferenceLayout 使用案例 和完善其自定义上拉
swipeReferenceLayout 无法完成上来加载数据所以自定义了一个类 Activity.java package qianfeng.com.swipelayoutdemo; import ...
- RxJava RxBinding RxView 控件事件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...
- RecyclerView与ListView 对比浅析:缓存机制
一. 背景 PS:相关知识:ListView与RecyclerView缓存机制原理大致相似,如下图所示: 滑动过程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取, ...
- ListView与RecyclerView对比浅析——缓存机制
https://www.jianshu.com/p/193fb966e954 一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大 ...
- andorid 列表视图 ListView 之BaseAdapter
.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android=&qu ...
随机推荐
- kfk: async disk IO深度解析
http://www.itpub.net/thread-1724044-1-1.html
- HDU 1133 Buy the Ticket 卡特兰数
设50元的人为+1 100元的人为-1 满足前随意k个人的和大于等于0 卡特兰数 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java ...
- 【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置
1.1概述 Android4.0,Androd4.4源代码能够编译成手机模式和平板模式,讯为iTop4412 开发平台 的Android系统默认编译为平板模式.客户须要依据自己的产品设计及应用环境,切 ...
- express 不是内部或外部命令(windows)解决方式
请环境变量设置 注意 "D:\soft\nodejs\"这个是笔者自己安装在电脑上的node js文件夹,请改动成自己的 假设安装的express是4.X就要安装 express- ...
- Ubuntu12.04LTS 安装 eclipse
首先安装JDK,参考:Ubuntu12.04.3LTS安装Oracle Java 7 然后安装eclipse: 安装方法一:通过命令行/Software Center下载Ubuntu源中的Eclips ...
- Qt 开发程序后的公布问题
Qt 开发程序后的公布问题 Qt 是一套跨平台 C++ 图形用户界面应用程序开发框架,利用它能够很方便的开发各种类型的应用程序.可是随着 Qt 的发展.功能越来越强大,公布时须要文件也越来越多.公布时 ...
- side-stepping the Global Interpreter Lock by using subprocesses instead of threads
16.6. multiprocessing — Process-based “threading” interface — Python 2.7.14 documentation https://do ...
- CDHD驱动器——ServoStudio配置高创伺服速度模式不转
1. 摘要 速度模式(LED灯显示为0)时,电机不转,但是在位置模式(LED灯显示为8)却可以正常运转. 2. 设置 设置commode=1,fbitprd=1,fbitidx=-3,modmode= ...
- 转 一个SMD 0805的LED的电流,电压,亮度关系表
Vf就是led的导通电压. 一个SMD 0805的LED的电流,电压,亮度关系表Vf If(算) 亮度1.74v 0.46mA 做指示灯不刺眼刚 ...
- 【POJ 3974】 Palindrome
[题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...