深入理解自定义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:这个类主要是工作是提供一 ...
随机推荐
- v8 javascript engine
https://code.google.com/p/v8-wiki/wiki/BuildingWithGYP vs2013git v8 http://github.com/v8/v8-git-mirr ...
- zedGraph
“zedGraph”控件画图的时候遇到了一点小问题,就是在同一个控件实例上第一次绘制饼图的时候一切正常,但是再次绘制的时候不是重新绘制新的饼图,而是在原有基础之上又添加进新的对象(PieItem),又 ...
- HDU-2952 Counting Sheep (DFS)
Counting Sheep Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- jQuery获取属性之自己遇到的问题
刚开始是这种写法 用的 attr 结果获取不到 if($("#reg_username_span").attr("display") == 'block') ...
- What is happening in Crockford's object creation technique?
What is happening in Crockford's object creation technique? http://stackoverflow.com/questions/27660 ...
- 点分治练习:不虚就是要AK
[题面] 不虚就是要AK(czyak.c/.cpp/.pas) 2s 128M czy很火.因为又有人说他虚了.为了证明他不虚,他决定要在这次比赛AK. 现在他正在和别人玩一个游戏:在一棵树上随机取两 ...
- linux 命令拾遗
man ascii 这个命令会打印出八进制.十六进制和十进制的ASCII码表. xxd xxd可以生成所给与文件的十六进制拷贝,也可以将编辑好的十六进制拷贝还原成二进制格式.它也可以将十六进制拷贝输出 ...
- JavaScript高级程序设计30.pdf
第12章 DOM2和DOM3 DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3则在这个结构的基础上引入了更多的交互能力,也支持更高级的XML特性 DOM2和DOM3级分为许多模 ...
- 2010 A B 2011 A B
湖南人文科技学院公共课 2010---2011学年第1学期<中国近代史纲要>课程考核试卷(A) 考核方式: (闭卷) ...
- 控制反转(IoC)与依赖注入(DI)
前言 最近在学习Spring框架,它的核心就是IoC容器.要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式.下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Sp ...