Android高级控件ListView和GridView原理分析
来源:互联网 发布:网络体系结构是指 编辑:程序博客网 时间:2024/06/02 22:39
对于Android开发来说,ListView控件在应用开发中的作用是举足轻重的,它以列表的形式展示内容,并且能够根据数据长度自适应显示。
列表数据的显示需要四个元素,分别为:
(1)用来展示列表视图的ListView;
(2)用来把数据映射到ListView上的Adapter(适配器);
(3)提供给ListView展示的数据集;
(4)数据展示的View界面模板。
首先最常用的列表展示类型的控件自然是ListView,该控件的职责是加载、管理视图,它并不关心有多少项数据,每一项数据将如何显示。除加载和管理视图之外的事情是由Adapter来完成的,通过Adapter模式,用户只需要覆写特定的几个函数就可以将ListView的每项数据(ItemView)构建出来。需要实现的Adapter函数为:
(1)getCount();——获取数据的个数;
(2)getItem(int position);——获取position位置上的数据;
(3)getItemId(int position);——获取position位置上的数据Id,一般只返回position即可;
(4)getView(int position,View convertView,ViewGroup parent);——获取position位置上的ItemView视图。
在这几个函数里面最重要的是最后一个函数getView(),下面给出这个函数使用的一般方法:
public View getView(int position, View convertView, ViewGroup parent){ View view = null; //有视图缓存,复用视图 if(convertView != null){ view = convertView; }else{ //重新加载视图 } //进行数据绑定 //返回ItemView return view;}
getView函数的position表示该视图是第几项数据,convertView表示缓存的ItemView,parent表示该ItemView的父视图。
ListView加载视图的原理:
当ListView加载时会根据数据的个数来创建ItemView,然后根据该View的索引从数据集合中获取数据,调用getView()获取具体的视图,并且与数据绑定。但是,并不是有多少数据就会产生多少ItemView,Android采用了视图复用的形式来避免创建过多的ItemView,这样能够非常有效的提升性能和降低内存占用率。
在处理的数据量较大时,ListView会构建铺满屏幕所需要的ItemView个数,当屏幕向下滚动时,第一项数据会滚出屏幕的可见范围之内,并且进入ListView的一个Recycler中,Recycler会将该视图缓存。当需要加载新的ItemView时ListView会首先检查Recycler中获取视图,如果视图存在就直接使用该缓存的视图,如果不存在则会创建新的视图。
从设计模式的角度看待ListView的原理:
ListView的核心就是使用了Adapter模式,并且在Adapter类中还使用了观察者模式,Adapter内部有一个可观察者类,ListView则作为它的其他的其中一个观察者。在将Adapter设置到ListView时,ListView会被注册到这个观察者对象中。setAdapter的代码如下:
@Overridepublic void setAdapter(ListAdapter adapter){ resetList(); mRecycler.clear();//清空视图缓存mRecycler if ( mAdapter != null){ mDataSetObserver = new AdapterDateSetObserver(); //将mDateSetObserver注册到adapter中 mAdapter.registerDataSetObserver(mDataSerObserver); } else { //... } requestLayout();}
- Android高级控件ListView和GridView原理分析
- android高级控件ListView
- ListView android高级控件
- android高级控件-ListView
- Android自定义控件(一):下拉刷新,支持ListView和GridView
- Android高级控件之ListView
- Android高级控件(View)之四TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList
- Android之ListView和GridView
- Android 自定义ListView和GridView
- android listview,GridView 和 ScrollView
- Android gridview、listview控件内容刷新问题
- Android高级UI控件—ListView
- Android UI高级控件中的ListView
- Android—高级控件(二)ListView
- Android ListView实现不同item的方法和原理分析
- Android ListView实现不同item的方法和原理分析
- Gridview控件高级技巧
- Gridview控件高级技巧
- 从头到尾彻底解析Hash 表算法
- 使用 Docker 构建开发、测试环境
- php根据月份获取月份的起始时间和结束时间
- 多态
- 复数
- Android高级控件ListView和GridView原理分析
- hadoop要点(三)
- maven + eclipse 问题记录
- vc 如何判断一个字符串是否是UTF8编码
- Java BASE64加密解密
- 手持盘点机,仓库盘点机,移动无线盘点机
- TCP和UDP的区别
- libuv 线程池的调度
- bos WebService安全性