深入理解自定义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:这个类主要是工作是提供一 ...
随机推荐
- Automator 简单使用流程
iOS开发中常常要用到图片缩放的工作,有些需求流程很奇葩,根本找不到现成的工具去实现. 这时候,你可以去想一想Automator了. 示例:要把文件夹下所有的图片文件都缩小成原来的一半(搞iOS开发的 ...
- Notice
13.793103448276 Notice: Undefined offset: -1 in C:\Zend\Apache2\htdocs\crawlWebsite\Crawl360.php on ...
- SharePoint用户控件编写的简单介绍
转:http://www.it165.net/design/html/201204/1131.html 我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickP ...
- ArcGIS_系列中文教程
转自:http://www.cnblogs.com/gispeng/archive/2008/04/15/1154212.html ArcGIS_系列中文教程 如链接有问题请在留言中说明ArcGIS ...
- HDU-1339 A Simple Task
http://acm.hdu.edu.cn/showproblem.php?pid=1339 正常做法超时,要有点小技巧存在. A Simple Task Time Limit: 2000/1000 ...
- HDU-2500 做一个正气的杭电人
http://acm.hdu.edu.cn/showproblem.php?pid=2500 做一个正气的杭电人 Time Limit: 1000/1000 MS (Java/Others) M ...
- [4X]荣耀畅玩4X开箱实录
http://www.jianshu.com/p/8d171c389ee8 文字都在简书里面啦~~
- [MarsZ]ThinkPHP项目实战总结
本文原word格式百度云盘下载地址: http://pan.baidu.com/s/1qYqZFkg 综述 2 需求 2 作者 2 系统一览 2 Unity3d客户端 2 PHP后台 4 准备 6 X ...
- 神经网络原理及其c++实现
1引言 数字识别是模式识别领域 中的一个重要分支,数字识别一般通过特征匹配及特征判别的传统方法进行处理.特征匹配通常适用于规范化的印刷体字符的识别,而 特征判别多用于手写字符识别,这些方法还处于探索阶 ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...