看源码之Adapter和AdapterView之间的关系
总述
Android中“列表”的实现其实一个典型的MVC模式,其实中AdapterView相当于是View,负责视图的绘制以及视图的事件响应,Adapter相当于是Controller,负责控制数据的显示内容和展现方式,另外项目中的实体类则是代表了Model。
Adapter
Adapter其实是个接口,并不是一个具体的类。它的主要最用就是作为一个AdapterView和Model间的桥梁,这一点在源码中有很清楚的定义:
/**
* An Adapter object acts as a bridge between an {@link AdapterView} and the
* underlying data for that view. The Adapter provides access to the data items.
* The Adapter is also responsible for making a {@link android.view.View} for
* ... ...
*/
getView()是Adapter非常重要的函数之一,这个函数的主要作用就根据在"列表"中位置的不同而展示不同的数据。具体可详见该方法的源码注释,上面已写的非常清楚了。
另一个就是registerDataSetObserver()和unregisterDataSetObserver(),好吧,应该是一对,这其实就是典型的一个观察者的设计模式,如果Adapter中需要加载的数据发生了变化,则我们就是通知Adapter来更新数据。当然,我们一般在项目中使用的是notifyDataSetChanged()方法,这是因为BaseAdapter不仅继承了Adapter,而且还对其中的一些方法进行封装,这其中就包括了DataSetObservable的notifyChanged()方法,源码如下:
/**
* 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();
}
AdapterView
AdapterView也是一个抽象类,例如AbListView等都是继承它而来。AdapterView中主要是一些监听器的设定,如:
Item 长按监听器
public interface OnItemLongClickListener {
/**
* Callback method to be invoked when an item in this view has been
* clicked and held.
*... ...
*/
boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id);
}
Item 点击监听器
public interface OnItemClickListener {
/**
* Callback method to be invoked when an item in this AdapterView has
* been clicked.
*... ...
*/
void onItemClick(AdapterView<?> parent, View view, int position, long id);
}
还有最常用且基本的等方法,如:
/**
* Returns the adapter currently associated with this widget.
*... ...
*/
public abstract T getAdapter();
/**
* Sets the adapter that provides the data and the views to represent the data
* in this widget.
*... ...
*/
public abstract void setAdapter(T adapter);
虽然AdapterView只是一个抽象类,但是其中的"干货"确实不是少,有着许多非常有用但是不常用的方法,如:
public boolean performItemClick(View view, int position, long id) {
if (mOnItemClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
if (view != null) {
view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
}
mOnItemClickListener.onItemClick(this, view, position, id);
return true;
}
return false;
}
顾名思义这是一个可以实现自动点击Item的方法,当你需要时直接使用可以省去不少的功夫。
结语
其实是由于上一篇文章探究Android中Listview显示错乱问题,引起我对探究ListView的内部源码的兴趣,当然由于水平有限只是从比较浅层的角度进行了探究,以后有时间定会继续研读源码。
看源码之Adapter和AdapterView之间的关系的更多相关文章
- 工作之余第二篇(看源码自己实现ArrayList和LinkList)
先看源码: 首先看构造器,构造器有三种,一种直接给定初始长度的,如下代码 public ArrayList(int initialCapacity) { if (initialCapacity > ...
- 专治不会看源码的毛病--spring源码解析AOP篇
昨天有个大牛说我啰嗦,眼光比较细碎,看不到重点.太他爷爷的有道理了!要说看人品,还是女孩子强一些.原来记得看到一个男孩子的抱怨,说怎么两人刚刚开始在一起,女孩子在心里就已经和他过完了一辈子.哥哥们,不 ...
- jQuery源码研究——怎么看源码
废话 这几天有想看源码的想法,于是就开始了源码的研究,经过几天的摸索发现看源码还是有点技巧在里面的,想着把这些东东写下来作为一个小总结. 在一个多月前我对Vue源码进行了一次研究,那时看源码的方式基本 ...
- idea看源码
idea看源码,可以直接搜索.看接口具体调用的是哪个类里面的方法(多态)
- Eclipse项目里面看源码和文档
Eclipse项目里面看源码 1.新建项目列表 2.进入struts2-core-2.3.20.jar,双击之后,看不到源码 3.右键struts2-core-2.3.20.jar,选择propert ...
- FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决
1:感觉见鬼了一般存储JSONObject中的字段竟然不见了? JSONObject object=new JSONObject(); Map fields = new HashMap(); fiel ...
- python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)
今天我们来说一说rest framework 中的 版本 操作的详解 首先我们先回顾一下 rest framework的流程: 请求进来走view ,然后view调用视图的dispath函数 为了演示 ...
- Spring AOP源码解析——专治你不会看源码的坏毛病!
昨天有个大牛说我啰嗦,眼光比较细碎,看不到重点.太他爷爷的有道理了!要说看人品,还是女孩子强一些. 原来记得看到一个男孩子的抱怨,说怎么两人刚刚开始在一起,女孩子在心里就已经和他过完了一辈子.哥哥们, ...
- 没必要看源码。。把文档学通就已经牛逼了(我们大多还是在应用层,还达不到研究的程度。附class与examples大全链接)
[学霸]深圳-鑫 2017/7/11 13:54:07只是学习怎么用QT的话,不用看源码.看帮助文档就很好要学习编码风格与思路,就看看源码 [学神]武汉-朝菌 2017/7/11 13:54:39没必 ...
随机推荐
- POJ 2029 Get Many Persimmon Trees(水题)
题意:在w*h(最大100*100)的棋盘上,有的格子中放有一棵树,有的没有.问s*t的小矩形,最多能含有多少棵树. 解法:最直接的想法,设d[x1][y1][x2][y2]表示选择以(x1, y1) ...
- motan源码分析十:流量切换
motan提供了流量切换的功能,可以实现把一个group的流量切换到另一个group(一个或多个服务都可以).大家可以使用tomcat部署motan的管理工具,并设置几个组,例如可以参考demo代码: ...
- 账户管理命令 useradd、groupadd
内容提要: 1. 掌握用户的 增/删/改 命令 2. 掌握组的 增/删/改 命令 组管理 1)groupadd groupadd 用于添加组账号.格式如下: groupadd [-g GID] GRO ...
- LayoutInflater和inflate()方法的使用方法
public static LayoutInflaterfrom(Context context) { LayoutInflaterLayoutInflater = (LayoutInflater)c ...
- PHP安全编程:会话数据注入 比会话劫持更强大的攻击(转)
一个与会话暴露类似的问题是会话注入.此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限.因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能.下例显示了一个允许用户 ...
- 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...
- Tomcat中Listener的使用范例(转载http://cywhoyi.iteye.com/blog/2075848)
Tomcat是非常有名的开源容器,因其开源我们可以对其做定制化的改变,而且Tomcat在其配置文件方面做了很多注释说明摘要,帮助我们更好的定制化我们所需的功能点. New Tomcat Listene ...
- vsftp配置主动模式和被动模式
配置文件:/etc/vsftpd/vsftpd.conf 主动模式配置方法: 主动式连接使用的数据通道 connect_from_port_20=YES 支持数据流的被动式连接模式 pasv_enab ...
- Oracle 存储过程(2)
http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html http://blog.itpub.net/29485627/view ...
- Ajax+Node分页
思路: ajax分页:1.服务器server.js,写布局;2.写接口文档(不管客户端,只写服务器端接口)3.写客户端,绑定数据,分页,优化点击过了,就不再请求:4.给每个li绑定点击事件,跳转详情页 ...