深入理解自定义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
的机制不断回收,具体原理如下图
适配器的优化参考我自己写的
自定义适配器优化
深入理解自定义ListView的更多相关文章
- Android复杂自定义Listview实现
在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderell ...
- Android 自定义ListView
本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(L ...
- 淘宝(阿里百川)手机客户端开发日记第四篇 自定义ListView详解
我们知道,如果采用官方的ListView,实现的功能在很多时候,并不能满足自己的业务需求,比如在设计到复杂的列表的时候,这一节,我们就开始动手自己实现自定义的ListView. 在上一节中,我们采用了 ...
- [置顶] android 自定义ListView实现动画特效
通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...
- android自定义listview实现圆角
在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...
- 自定义listView添加滑动删除功能
今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...
- android之ListView,详细介绍实现步骤,举例,自定义listview适配器
android之ListView,详细介绍实现步骤,举例,自定义listview适配器 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listVie ...
- fragment、ListFragment使用ListView及自定义Listview等初始化操作
fragment.ListFragment使用ListView及自定义Listview等初始化操作 1.先说一下 从官方api中说fragment碎片中使用Listview有专门的 ListView碎 ...
- 借助TZImagePickerController三方库理解自定义相册
借助TZImagePickerController三方库理解自定义相册 1.整体架构分析 整体框架大致可以分为几个部分 <1>工具类-TZImageManager:这个类主要是工作是提供一 ...
随机推荐
- VS2010中 为图片添加背景图片
很简单的东西,嘿嘿 void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage( ...
- 【转】Android bluetooth介绍(二): android blueZ蓝牙代码架构及其uart 到rfcomm流程
原文网址:http://blog.sina.com.cn/s/blog_602c72c50102uzoj.html 关键词:蓝牙blueZ UART HCI_UART H4 HCI L2CAP ...
- 【Android 复习】:从Activity中返回数据
在实际的应用中,我们不仅仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递类似,也可以采用上一讲中的四种方式来传递数据,但是一般建议采用Intent对象的方式的来返 ...
- 你认为A和B所在方格颜色相同吗?
[你认为A和B所在方格颜色相同吗? ]据说全世界只有0.003%的人和photoshop能看出它们的颜色是相同的. 我属于那 99.9997% 的人...因为我不是神...
- 用vs2010调试javascript
操作步骤如下: 1. javascript代码中插入:debugger,如下: <script type="text/javascript"> debugger; ...
- Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文
博主实现(in Unity3d 5) used one spotlight 史克威尔效果展示(夜光引擎?) 博主近期渲染:最近用unity5弄的一些渲染 ---- by wolf96 http:// ...
- 洛谷P1407 工资
洛谷P1407 工资 本题地址:http://www.luogu.org/problem/show?pid=1407 题目描述 有一家世界级大企业,他们经过调查,发现了一个奇特的现象,竟然在自己的公司 ...
- C语言练习题_北理工的恶龙
背景:最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙.要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的 ...
- curl测试puppet http api接口
---恢复内容开始--- 基于证书密钥对 curl --cert /etc/puppetlabs/puppet/ssl/certs/master.puppet.org.pem --key /etc/p ...
- head frist 设计模式学习之 JVM中的博物馆奇妙夜(观察者模式)
博物馆奇妙夜! 博物馆奇妙夜!博物馆奇妙夜!重说三!!!JVM看了<博物馆奇妙夜>电影之后,决定在自己家里开一个博物馆!毕竟需要什么new一下就好,博物馆很快就开起来了,并且任命你为馆长( ...