深入理解自定义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:这个类主要是工作是提供一 ...
随机推荐
- linxu命令小结
1.设置root用户的密码 sudo passwd root 2.切换用户 su username su:switch user的简写 3.切换到超级用户 sudo su sudo (super us ...
- 如何禁止anonymous用户访问nexus
nexus在默认情况下是允许anonymous用户浏览仓库,并下载仓库中的jar包的,如果我们搭建的私服是有公网IP的,必须要进行设置,使得anonymous用户的权限被禁用.操作步骤如下: 使用管理 ...
- -_-#【Better Code】
i++ 与 ++i 的性能区别 if (true) { console.log('hi') } if (!false) { console.log('hi~') } true && c ...
- 大型邮箱smtp服务器及端口 收集
各大型邮箱smtp服务器及端口收集: 新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sin ...
- [转]ESCAPE()、ENCODEURI()、ENCODEURICOMPONENT()区别详解
escape().encodeURI().encodeURIComponent()区别详解 JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encode ...
- [转载]tcp可靠性的好文
TCP是通过什么方式来提供可靠传输的 2012-11-23 14:18 665人阅读 评论(0) 收藏 举报 TCP是通过什么方式来提供可靠传输的 (合理截断数据包,超时重发,校验,失序重新排序,能够 ...
- (转载)WindowsXP上安装和运行神器SqlMap的步骤
在Windows XP上安装和运行SqlMap的步骤…… 1.首先下载SqlMap 点击下载. https://codeload.github.com/sqlmapproject/sqlmap/leg ...
- zabbix邮件告警
Zabbix邮件告警看了很多文档,写的那叫一个蛋疼,明明没有发出去邮件,硬要糊弄观众,我也跟着被糊弄. 操作系统环境: CentOS 5.5 x84_64位 Zabbix版本2.2.3 Web服务器: ...
- python手记(26)
#!/usr/bin/env python import cv2 import sys fn="test2.jpg" if __name__ == '__main__': prin ...
- jni编译non-numeric second argument to `wordlist' function错误
在jni编译过程中,遇到non-numeric second argument to `wordlist' function错误,个人遇到这个错误的原因,是因为从windows中拷贝了Android. ...