Android面试---ListView原理及fling分析

本文深入探讨了Android ListView的工作原理,包括为何使用Adapter、RecycleBin的作用、ListView的绘制与回收机制,以及惯性滑动(fling)的实现。分析了ListView如何通过Adapter与数据交互,利用RecycleBin进行视图复用以避免崩溃,同时详细解释了fling事件的处理过程,帮助理解ListView的高性能表现。
摘要由CSDN通过智能技术生成

为了节约你的时间,上面的图是整个文章的最终图,包括了以下部分问题的答案。

目录

1.为什么需要使用Adapter?

RecycleBin是什么? 

2.ListView的绘制过程是怎样的?

3.ListView的回收机制是怎么样的?为什么可以显示100个View而不崩呢?

4.ListView里面的观察者模式是什么?

5.惯性滑动(fling)是怎么实现的?

0.基本使用

获取ListView视图对象,设置adapter。

ListView lv = new ListView(context);
lv.setAdapter(new SimpleAdapter);

1.为什么需要使用Adapter?

ListView集成自absListView,同级的还有GridView。实际上我们可以发现,ListView是一个ViewGroup,提供把每个子View按照纵向布局在一起,然后提供滑动和fling功能。

从下面的图我们可以看到,左边是ListView,右边是data,中间是adapter,在这里ListView并不关心数据(data),是从数据库的cursor获取还是是从数组里面获取,我们只需要通过适配器Adapter统一一个协议就行。

试想一下不管是GridView还是ListView又或者是RecyclerView,无一不是需要知道总共几个子View,获取每个子View的视图,如果有多种类型的子View,还需要ItemViewType。所以我们其实就可以定义几个方法来获取这几个值,你看getView(获取子视图)、getCount(总共有几个子视图)、getItemViewType(每个子视图的type),这几个方法熟悉吗??我们实现这几个接口就能用adapter适配数据了。

那么有同学说,既然adapter隔离了数据,那么数据变动刷新ListView怎么操作呢?

你看1.1 register先注册观察者、1.2 notifyDataSetChanged 1.3 notifyChanged 不是典型的观察者模式吗? 这样就实现了adatper通知ListView刷新的功能了。

RecycleBin是什么? 

RecycleBin是用于ListView子元素的缓存。里面有一个View[] mActiviesViews和ArrayList<View>[] mScrapViews。mActiviesViews用于存放ListView在屏幕内的对象,mScrapViews用于存放ListView移出屏幕的对象。注意mScrapViews是一个数组,索引是ItemType,元素是ArrayList<View>,所以说视图是按照ItemType为维度回收的,所以复用也是ItemType维度复用的

图片左边是RecycleBin,右边是ListView,ListView中的所有元素,都是存在mActiviesViews里面一份的,所以当ListView刷新时,可以很快速的从内存中取出View来布局。当ListView上滑并且元素0完全移出屏幕时,会回收到RecycleBin的mScrapViews里面的ItemType类型为索引的ArrayList里面。

2.ListView的绘制过程是怎样的?

ListView也是ViewGroup,所以它的流程也是measure、layout、draw。ViewGroup的measure里面其实就是调用子布局的mesure,没什么特殊的。draw的话,其实也是调用子布局的绘制方法。所以我们分析layout过程,layout过程分为2种情况。

  1. 第一次layout。第一次layout,在RecycleBin获取不到mActiviesViews缓存,所以调用getView()直接朝adapter要View,要来了View后,然后逐个layout布局。
  2. 第N次layout。在RecycleBin获取到mActiviesViews缓存,然后逐个layout布局

3.ListView的回收机制是怎么样的?为什么可以显示100个View而不崩呢?

看图!!!

当我们向上滑动时,ListView的onTouchEvent中的move判断条件调用,判断元素0的getBottom()小于滑动距离,也就是元素0即将移出屏幕,这个时候ListView认为元素0没有用了&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值