Android面试系列文章2018之ListView篇

Android面试系列文章2018之ListView篇

ListView知识体系图

1.ListView是什么

  ListView就是能用一个数据集合以动态滚动的方式展示到用户界面上的View。

2.ListView的用法

2.1 ListView的适配器

2.2 布局的设置

  • (1)分割线

  添加分割线的两种方法:[1]divider&dividerHeight(分割线高度,也可以作为Item之间的间距) [2]在Item的布局中添加

  https://blog.csdn.net/wenzhi20102321/article/details/65628091

  • (2)Item间距问题

  https://blog.csdn.net/android_freshman/article/details/52077323

  • (3)HeadView&FootView

addHeaderView()方法:主要是向listView的头部添加布局
addFooterView()方法:主要是向listView的底部添加布局

以addHeaderView为例:

View headView = getLayoutInflater().inflate(R.layout.igame_wb_details_task_list_layout_header, null);

mLvList.addHeaderView(headView);

  这样就可以将一个layout放在ListView的头部,需要注意的是,布局文件最外层的layout样式中的margin要更改成padding,因为margin是指本容器与其他容器的距离,padding是指该View里面的子view与该View的距离。加进来的布局文件是相对独立的,如果使用margin就起不到效果。

  • (4)侧滑条

  https://blog.csdn.net/ccpat/article/details/50805129

2.3 介绍ListView中一些常用的方法

http://www.zhdoc.net/android/reference/android/widget/ListView.html

2.4 如何刷新数据&一些注意的地方

https://blog.csdn.net/qq_26559913/article/details/53817263

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主要是用来间接复用的。

源码角度分析ListView的recycleBin机制

4.ListView的源码分析

  郭大神的博客:

5.ListView的优化

a.convertView重用机制

b.ViewHolder机制

c.三级缓冲/滑动监听事件

优化一:在Adapter中的getView方法中使用ConvertView,即ConvertView的复用,不需要每次都inflate一个View出来,这样既浪费时间,又浪费内存。

优化二:使用ViewHolder,不要在getView方法中写findViewById方法,因为getView方法会执行很多遍,这样也可以节省时间,节约内存。

优化三:使用分页加载,讲真实际开发中,ListView的数据肯定不止几百条,成千上万条数据你不可能一次性加载出来,所以这里需要用到分页加载,一次加载几条或者十几条,但是如果数据量很大的话,像qq,微信这种,如果顺利加载到最后面的话,那么你的list中也会有几万甚至几十万的数据,这样可能也会导致OOM,所以你的数据集List中也不能有那么多数据,所以每加载一页的时候你可以覆盖前一页的数据。

优化四:如果数据当中有图片的话,使用第三方库来加载(也就是缓存),如果你的能力强大到能自己维护的话,那也不是不可以。

优化五:当你手指在滑动列表的时候,尽可能的不加载图片,这样的话滑动就会更加流畅。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值