listView 优化点

2015-05-08 党洁 更多博文 » 博客 » GitHub »

原文链接 https://jiedang.github.io/2015/05/08/listview%E4%BC%98%E5%8C%96%E7%82%B9.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


list view 应该注意的地方

  1. 利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View。ListView 中有一个回收器,Item 滑出界面的时候 View 会回收到这里,需要显示新的 Item 的时候,就尽量重用回收器里面的 View。
  2. 利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView 的回收,当然类型不能太多; 实现多个不同ITEM类型 也主要是使用 adapter中得 getViewTypeCount 和 getItemViewType 3 . 尽量让 ItemView 的 Layout 层次结构简单,这是所有 Layout 都必须遵循的;善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制; 4 .尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
    1. 每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item,相关文章:https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/
  3. 为了保证 ListView 滑动的流畅性,getView() 中要做尽量少的事情,不要有耗时的操作。特别是滑动的时候不要加载图片,停下来再加载, 类似开源库Glide:https://github.com/bumptech/glide
  4. 使用 RecycleView 代替。 ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。