几种适配器&观察者&ListView之间的那点事
android中的几种适配器&观察者&ListView
1.我们知道Android中的Adapter类是处于ListView和数据源之间的数据总线,它负责为ListView提供数据。
2.适配器(BaseAdapter)中提供了一个notifyDataSetChanged()方法,当数据源中的数据发生变化时,可以通过调用该方法去通知ListView更新界面上的数据。
3.常见的三种adapter它们可以显示的数据的区别在哪里:
- ArrayAdapter,数据源中只能是文本数据,只要传入的显示每行的布局View是TextView类型或者包含TextView控件即可。
- SimpleAdapter,数据源中可以有图片或文本,显示控件集合和图片、文本数据集合可以通过两个数组对应传入。
- CursorAdapter,为访问数据库而定义。

从上面的类图,可以看到:
- 抽象类BaseAdapter更灵活,如果自定义自己的Adapter集成它更合理。
- Adapter的地位就像观察者模式中的Subject。
- 在给UI指定Adapter时,必须要给Adapter注册一个观察者,这样当调用者调用adapter的notifyDataSetChanged()方法时,才可以更新自己UI,所以顶用者必须自定义
DataSetObserver对象,用以处理数据变化时的UI更新。
- mDataSetObservable是一个聚合对象,也就是说它里面可以放多个观察者,所以调用者可以在同一个adapter中注册多个
DataSetObserver 对象,这样当数据发生变化时,可以有多个不同的处理逻辑。

上图为ListView的setAdapter()方法中的片段,可以看到,在给ListView设置adapter数据源时,同时给adapter数据源注册了一个观察者。
而这个观察者回调中的处理方法正是用以处理ListView的UI更新,其实现源代码如下图。

完成整个数据更新过程如下:
- UI(ListView)在给自己设置数据源时(setAdapte())时,同时向Adapter的mDataSetObservable成员中注册了一个观察者回调监听器,该监听器负责用变化后的数据刷新UI。
- 当数据源发生变化时,先调用adapter的notifyDataSetChanged()方法,这时adapter负责将自己注册的所有观察者都通知一遍,告诉它们数据发生变化了。
- 因为第一步已经注册了观察者,自然UI就得到了更新。
几种适配器&观察者&ListView之间的那点事的更多相关文章
- Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...
- Android应用项目中BaseAdapter、SimpleAdapter和ArrayAdapter中的三种适配器
一.写在前面: 本次我们来讲解一下Android应用中三个适配器:BaseAdapter.SimpleAdapter和ArrayAdapter.其中常见的是BaseAdapter,也是个人推荐使用的适 ...
- (转载) Android-Spinner的使用以及两种适配器
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 Android-Spinner的使用以及两种适配器 201 ...
- listview的两种适配器
一. ArrayAdapter ListView listView = (ListView) findViewById(R.id.list_view);//ListView的参数为id listVie ...
- android listview 三种适配器设置
1: public class ArrayAdapterActivity extends ListActivity { @Override public void onCreate(Bundle sa ...
- 【Android自学日记】两种适配器的使用
ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前L ...
- 【Android】以BaseAdapter做适配器的ListView及其性能优化
适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...
- 【Android】以SimpleAdapter做适配器的ListView和GridView
SimpleAdapter介绍 SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图. 构造函数 public SimpleAdapter (Context co ...
- storyboard三种sugue 和 跳转场景的三种方式 以及控制器之间的传值
Storyboard引入了2个概念:1. scene:一个场景,由一个viewController和相关的xib表示. 2. segue:在这是用于连接scenes,其有多种类型,iphone包括:P ...
随机推荐
- python3-开发进阶补充Django中的文件的上传
PS:这段时间有点不在状态,刚刚找回那个状态,那么我们继续曾经的梦想 今天我们来补充一下文件的上传的几种方式: 首先我们先补充的一个知识点: 一.请求头ContentType: ContentType ...
- centos6.5编译安装nginx
系统64位 centos6.5 nginx官网:http://nginx.org/ 下载nginx源码包: wget http://nginx.org/download/nginx-1.6.2.ta ...
- opensue fstab故障恢复
date: 20140505 author: Jin 故障背景: 早上启动本本 无法启动,报错信息(几个关键) WARNING:Failed to connect to lvmetad: No suc ...
- Delphi 类引用 Class Reference 元类 MetaClass 用法
delphi中类引用的使用实例 类引用类引用(Class Reference)是一种数据类型,有时又称为元类(MetaClass),是类的类型的引用.类引用的定义形式如下: class of type ...
- Multivariate Adaptive Regression Splines (MARSplines)
Introductory Overview Regression Problems Multivariate Adaptive Regression Splines Model Selection a ...
- [Android实例] Android 6.0RecyclerView SwipeRefreshLayout 下拉刷新 上拉加载
这是Android 6.0的 SwipeRefreshLayout 实现下拉刷新和RecyclerView的上拉加载更多,以及添加分割线等 Android <ignore_js_op> r ...
- appium+python自动化51-adb文件导入和导出(pull push)
前言 用手机连电脑的时候,有时候需要把手机(模拟器)上的文件导出到电脑上,或者把电脑的图片导入手机里做测试用,我们可以用第三方的软件管理工具直接复制粘贴,也可以直接通过adb命令导入和导出. adb ...
- [Android Memory] Linux下malloc函数和OOM Killer
http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请 ...
- 万里长征第二步——django个人博客(第一步 ——创建主页)
运行命令行工具,输入:pip install virtualenv --安装virtualenv库. virtualenv blog_project_venv ——使用virtualenv创建一个虚 ...
- [Java]利用javax.swing.Timer类在窗口上实现动画效果
javax.swing.Timer类在创建时需要指定时间间隔和定时器到时间需要执行的动作,即ActionListener. Timer timer = new Timer(100, taskPerfo ...