深入理解自定义ListView
深入理解自定义ListView
ListView
原理
他是一个系统的原生控件,用列表的形式来显示内容。如果内容过过有1000条左右,我们可以通过手势的上下滑动来查看数据。
ListView
也不是爆出OOM(out of memery
)错误。下面是类的继承机构
我们给
ListView
装配数据的时候,要给他定义一个适配器Adapter
,为什么要定义呢?
我的理解是给ListView
一个通道,在和我们的数据之间建立一个连接,这样当ListView
需要展现什么的数据,什么样的布局的时候我们就可以通过自己定义的Aapter
中的getView(parament...)
方法来获取到我们要加入到ListView
的视图。- RecycleBin机制,它是写在
AbsListView
中的一个内部类,所以所有继承自AbsListView
的子类,也就是ListView
和GridView
,都可以使用这个机制,
主要作用,通过一系列方法,实现View
的缓存机制,
fillActiveViews(...)
这个方法接收两个参数,第一个参数表示要存储的view
的数量,第二个参数表示ListView
中第一个可见元素的position
值。RecycleBin
当中使用mActiveViews
这个数组来存储View,调用这个方法后就会根据传入的参数来将ListView
中的指定元素存储到mActiveViews
数组当中。
getActiveView(...)
用于根据参数*position
获取mActiveViews
当中的View
。需要注意的是当View
一旦被获取以后,下次再获取同样的位置就将会是null
。所以mActiveView
不能重复利用.\。
addScrapView(...)
用于将一个废弃的View
缓存。当我们View
将要废掉以后(比如滚出屏幕)。那么就会调用这个方法进行缓存。RecycleBin当中使用mScrapViews
和mCurrentScrap
这两个List
来存储废弃View
。
getScrapView(...)
用于在mScrapViews
中末尾取出一个废弃View
,
setViewTypeCount()
我们都知道Adapter
当中可以重写一个getViewTypeCount()
来表示ListView
中有几种类型的数据项,而setViewTypeCount()
方法的作用就是为每种类型的数据项都单独启用一个RecycleBin缓存机制。实际上,getViewTypeCount()
方法通常情况下使用的并不是很多,所以我们只要知道RecycleBin当中有这样一个功能就行了.
- 如何绘制
View
.我们通过自定义Adapter
中重写getView()
,获取到要显示的View
,当我们装载到ListView
的时候,是通过onMeasure()
来测量大小。onLayout()
用于确定View的布局,onDraw
来绘制View
显示到界面上。但是ListView
不负责绘制,是由他的子元素进行绘制的。
5.滑动加载更多数据 ,ListView
有滑动的监听机制onTouchEvent()
来监听手势的滑动。因为滑动是通用的机制所以写在AbsListView
当中,所以GridView
也可以使用这个机制。
View obtainView(int position, boolean[] isScrap) {
isScrap[0] = false;
View scrapView;
scrapView = mRecycler.getScrapView(position);
View child;
if (scrapView != null) {
child = mAdapter.getView(position, scrapView, this);
if (child != scrapView) {
mRecycler.addScrapView(scrapView);
if (mCacheColorHint != 0) {
child.setDrawingCacheBackgroundColor(mCacheColorHint);
}
} else {
isScrap[0] = true;
dispatchFinishTemporaryDetach(child);
}
} else {
child = mAdapter.getView(position, null, this);
if (mCacheColorHint != 0) {
child.setDrawingCacheBackgroundColor(mCacheColorHint);
}
}
return child;
}
通过读取上面的代码我们可以理解到:如果RecycleBin对应mRecycler
中获mActiveView
储存当中末尾获取一个废弃的View
。
通过如下代码传递一个scrapView
child = mAdapter.getView(position, scrapView, this);
如果为null
的话。那么就会通过该段代码
child = mAdapter.getView(position, null, this);
可以看到mAdapter
就是我们自己定义的适配器。所以obtainView
类会通过不断回收废弃的Veiw
通过getView(...)
来获取数据,所以就不会爆出OOM错误了。因为在Listview
当中,通过RecycleBin
的机制不断回收,具体原理如下图
适配器的优化参考我自己写的
自定义适配器优化
最新文章
- TreeMap的使用
- jQuery中find和filter的区别
- c++模板类
- 2016年11月17日--SQL主、外键,子查询
- 使用imap协议接收邮件
- media query学习笔记
- Spring <;context:annotation-config/>; 解说
- tomcat通过conf-Catalina-localhost目录发布项目详解
- UVAoj 11324 - The Largest Clique(tarjan + dp)
- linux 相关系列安装
- [resource]23个python的机器学习包
- 【Android - 进阶】之图片三级缓存的原理及实现
- JAVA基础--IO流
- stm单片机之STM32F4-Discovery资料汇总 (转载自http://blog.163.com/thinki_cao/blog/static/83944875201362493134992/)
- js中替换字符串(replace方法最简单的应用)
- Android TV开发总结(二)构建一个TV Metro界面(仿泰捷视频TV版)
- Oracle SPA取报告阶段xml解析失败解决方案
- 《FPGA设计技巧与案例开发详解-第二版》全套资料包
- 命令行 设置redis 时间
- 学习笔记之.NET Core
热门文章
- Ext.onReady(function(){} )函数的作用域分析(1)
- FusionCharts参数说明-----3D饼图属性(Pie3D.swf )
- 向SharePoint页面添加后台代码
- (转载)查看三种MySQL字符集的方法
- android学习——ADT的离线安装
- java基础(十八)IO流(一)
- HDOJ/HDU 1015 Safecracker(枚举、暴力)
- JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解
- hdu 4790 Just Random (2013成都J题) 数学思路题 容斥
- cuda(1) 最大并发量