Android面试系列文章2018之ListView篇

1.ListView是什么

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

2.ListView的用法

2.1 ListView的适配器

  • ArrayAdapter
  • SimpleAdapter
  • SimpleCursorAdapter
  • BaseAdapter(自定义适配器)

2.2 布局的设置

  • (1)分割线

  添加分割线的两种方法:[1]divider÷rHeight(分割线高度,也可以作为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的源码分析

  郭大神的博客:

  • https://blog.csdn.net/guolin_blog/article/details/44996879

5.ListView的优化

a.convertView重用机制

b.ViewHolder机制

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

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

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

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

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

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

更多相关文章

  1. Android(安卓)自定义View(二)函数分析
  2. Android(安卓)ListView分页加载数据Demo
  3. Android(安卓)开发之 ClipboardManager
  4. android Service深入详解
  5. Android碎知识点以及正则表达式
  6. [Android]Service和Activity双向通信的两种方式
  7. Android利用Soap读取WebService并且解析XML的DataSet数据
  8. 横竖屏切换不重启activity的方法
  9. Android(安卓)Content Provider Guides

随机推荐

  1. Android(安卓)绘制太极图实例详解
  2. Android(安卓)自定义Gallery
  3. 【Android】利用广播Broadcast接收SMS短
  4. 《Android(安卓)计算器》
  5. 手机横屏时,键盘默认全屏显示
  6. android时间控件TimePicker使用实例
  7. android 动画1
  8. Android基于TitleBar页面导航实现
  9. android 动态加载Listview
  10. Android原生壁纸加载日志