listView详解
- 什么是listView
- listView适配器模式
- listView的recycleBin机制。垃圾回收机制
- listView的优化
1.什么是listView
ListView就是一个能把数据集合以动态滚动的方式展现在用户界面上的View。本质上是一个View,专门用户处理数据很多,屏幕一次展现补全的场景
2.listView适配器模式
![](https://img.haomeiwen.com/i1976436/56193a4c9a5a8ec6.jpg)
适配器模式:
Datasource(Cursor、ArrayList) <--Adapter -->ListView
用法,继承BaseAdapter,通过ListViw的setAdapter把数据传递给ListView
到底什么是Adapter?
因为android的listView需要把各种可能的数据和用户自定的View全部显示在屏幕上,而ListView本身是一个View,他不关心数据是什么,他只是一个垂直显示的列表而已,它最关心的是ListView的item那个position即哪个位置显示哪一个View。它只是关系把View准确无误的显示到它所在的Item上。ListView和数据是分开的,不直接接触,只能通过Adapter适配器把数据加载到ListView的屏幕上
图示可以看出Adapter是数据源和ListView的桥梁,它负责为每一个数据制作View交给View来显示,adapter的出现就是为了保证数据和View分离
MVC的设计模式,它只会通过adapter来处理真正的数据源,同时adapter接口又是统一的,这会让ListView不用去担心数据适配方面的问题,由于Adatper是一个接口,每个子类都可以自定义自己的功能
图:
![](https://img.haomeiwen.com/i1976436/173ce0dd01041b59.jpg)
![](https://img.haomeiwen.com/i1976436/f27d2552ddd314e7.jpg)
![](https://img.haomeiwen.com/i1976436/b44e73a2909faa56.jpg)
![](https://img.haomeiwen.com/i1976436/6b4ceded03a9c6a5.jpg)
![](https://img.haomeiwen.com/i1976436/ac8e39d3256a7aa0.jpg)
![](https://img.haomeiwen.com/i1976436/711e4ee14180ced9.jpg)
![](https://img.haomeiwen.com/i1976436/ee4371bab7195296.jpg)
Activity中:listView.setAapter(new MyAdapeer(this));
MyAdapter extends BaseAdapter
#Context
-----------
+getCount() int
+getItem(int position) object
+getItemId(int position) long
+getView(int position,View convertView,ViewGroup parent) View
ViewHolder机制
ListView绘制 getCount->getView->
3.listView的recycleBin机制。垃圾回收机制
数据很多,频繁滑动
源码
UML 类结构图:
![](https://img.haomeiwen.com/i1976436/ec7e869762bd32dc.jpg)
class RecycleBin{
private RecyclerListener mRecyclerListener;
private int mFirstActivePosition;
private View[] mActionViews = new Views[0];//屏幕上正在可见的View,这些View是可以被复用的
private ArrayList<View> mScrapViews;//他是一个二维数组,他表示所有废弃类型View的list,当屏幕滑出去时,他的item就变成了scrapView一员。
private ArrayList<View> mCurrenScrap;//当前废弃的View的List,刚刚滑出去
//ListView滑动的时候会把滑出去的View删除,这样就不会绘制那些看不见的View,那些看不见的View会放在RecycleBin里头(回收站,需要时去还原)
方法:
public void setViewTypeCount(int viewTypeCount){
为ListView中的每一个类型的数据项建立一个recyclebin机制,意思是说可以为不同类型的View 都设置recyclebin机制
默认是1. 即一种设置类型
}
//填充,存储
void fillActiveViews(int childCount,int firstActivePosition){
//参数1.表示要存储的View的数量
参数2.表示ListView当中第一个可见元素的position值
}
//获取屏幕上相应显示的View
View getActiveView(int position){//position表示item在ListView中的位置
int index = position - mFirstActivePosition;//神奇的地方,将position的值转成mActiveViews数组的下标值
final View[] activeViews = mActiveViews;
if(index >=0 && index <activeViews.length){
final View match = activeViews[index];
activeViews[index] = null;//下次获取同样位置的View会是null,mActiveView在屏幕上的View是不能被重复利用的
return match;
}
return null;
}
void addScrapView(View scrap,int position){//接收刚刚被划出,要废弃的View,添加到mScrapViews中
final AbsListView.LayoutParams lp = (AbsListView.LayoutParams)scrap.getLayoutParams();
}
}
图:
4.listView的优化
- convertView重用 /ViewHolder
- 三级缓存/监听滑动事件
1.convertView重用 /ViewHolder
Adapter中,方法getView(int position,View convertView,ViewGroup parent) 中convertView就是一个缓存的作用
ViewHolder = holder;
if(convertView = null){
holder = new ViewHolder;
convertView = LayoutInflater.from(context).inflate(R.layout.list_item,null);
holder.img = convertView.findViewById();
convertView.setTag(holder)
}else{
holder = convertView.getTag();
}
return convertView;
1.convertView 复用非常重要 2.View是二叉树结构,每次遍历都耗性能,减少findViewById
2.三级缓存/监听滑动事件
- 图片加载的时候用到缓存机制来进行,
- 在getView中尽量少进行耗时的操作,这是为了保证在ListView滑动当中的流畅性,一旦做耗时操作,就显示ListView的卡顿
- 一定要在ListView中加载图片,可以设置监听事件,可以当ListView滑动停止时加载图片
- ListView的Item的布局当中尽量避免半透明的元素,因为半透明的绘制比不透明耗时, 同时可以开启硬件加速
网友评论