Android面试系列文章2018之ListView篇
2018-02-24 21:25
302 查看
Android面试系列文章2018之ListView篇
1.ListView
1.1 ListView是什么?
ListView就是能用一个数据集合以动态滚动的方式展示到用户界面上的View。1.2 ListView的适配器
介绍三种AdapterArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字
SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果
BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter
BaseAdapter是开发中最常用的适配器ArrayAdapter, SimpleAdapter 都继承于BaseAdapter。BaseAdapter可以完成自己定义的Adapter,可以将任何复杂组合的数据和资源,以任何你想要的显示效果展示给用户。
继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。
系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。每绘制一个Item就会调用一次getView方法,在getView中引用事先定义好的layout布局确定显示的效果并返回一个View对象作为一个Item显示出来。
这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了这两个方法,ListView就能完全按开发者的要求显示。而getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。
1.3 ListView的recycleBin机制
在某一时刻,我们看到ListView中有许多View呈现在UI上,这些View对我们来说是可见的,这些可见的View可以称作OnScreen的View,即在屏幕中能看到的View,也可以叫做ActiveView,因为它们是在UI上可操作的。当触摸ListView并向上滑动时,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范围,此时这些OnScreen的View就变得不可见了,不可见的View叫做OffScreen的View,即这些View已经不在屏幕可见范围内了,也可以叫做ScrapView,Scrap表示废弃的意思,ScrapView的意思是这些OffScreen的View不再处于可以交互的Active状态了。ListView会把那些ScrapView(即OffScreen的View)删除,这样就不用绘制这些本来就不可见的View了,同时,ListView会把这些删除的ScrapView放入到RecycleBin中存起来,就像把暂时无用的资源放到回收站一样。
当ListView的底部需要显示新的View的时候,会从RecycleBin中取出一个ScrapView,将其作为convertView参数传递给Adapter的getView方法,从而达到View复用的目的,这样就不必在Adapter的getView方法中执行LayoutInflater.inflate()方法了。
RecycleBin中有两个重要的View数组,分别是mActiveViews和mScrapViews。这两个数组中所存储的View都是用来复用的,只不过mActiveViews中存储的是OnScreen的View,这些View很有可能被直接复用;而mScrapViews中存储的是OffScreen的View,这些View主要是用来间接复用的。
1.4 ListView的优化
a.convertView重用机制b.ViewHolder机制
c.三级缓冲/滑动监听事件
优化一:在Adapter中的getView方法中使用ConvertView,即ConvertView的复用,不需要每次都inflate一个View出来,这样既浪费时间,又浪费内存。
优化二:使用ViewHolder,不要在getView方法中写findViewById方法,因为getView方法会执行很多遍,这样也可以节省时间,节约内存。
优化三:使用分页加载,讲真实际开发中,ListView的数据肯定不止几百条,成千上万条数据你不可能一次性加载出来,所以这里需要用到分页加载,一次加载几条或者十几条,但是如果数据量很大的话,像qq,微信这种,如果顺利加载到最后面的话,那么你的list中也会有几万甚至几十万的数据,这样可能也会导致OOM,所以你的数据集List中也不能有那么多数据,所以每加载一页的时候你可以覆盖前一页的数据。
优化四:如果数据当中有图片的话,使用第三方库来加载(也就是缓存),如果你的能力强大到能自己维护的话,那也不是不可以。
优化五:当你手指在滑动列表的时候,尽可能的不加载图片,这样的话滑动就会更加流畅。
相关文章推荐
- Android面试系列文章2018之Android部分View绘制机制篇
- Android面试系列文章2018之Android Studio目录结构篇
- Android面试系列文章2018之Java部分注解篇
- Android面试系列文章2018之架构搭建之MVC模式篇
- Android面试系列文章2018之Android部分Broadcast篇
- Android面试系列文章2018之实战经验部分之gradle篇
- Android面试系列文章2018之Java部分反射机制篇
- Android面试系列文章2018之Android部分Fragment篇
- Android面试系列文章2018之Java部分IO编程篇
- Android面试系列文章2018之Android构建流程篇
- Android面试系列文章2018之实战经验部分之依赖注入框架篇
- Android面试系列文章2018之Android部分Handler机制篇
- Android面试系列文章2018之Android部分IntentService机制篇
- Android面试系列文章2018之Android部分WebView篇
- Android面试系列文章2018之进程保活篇
- Android面试系列文章2018之http协议篇
- Android面试系列文章2018之异常处理OOM异常篇
- Android面试系列文章2018之内存管理之Bitmap的加载篇
- Android面试系列文章2018之内存管理篇
- Android面试系列文章2018之Android部分之动画机制篇