ListView优化

ListView优化

2018, May 30    

ListView优化
1- convertView重用: 在getview中先判断convertView是否为空,这样在view没有改变宽高时,可以减少重新分配缓存;
2- ViewHolder优化:findViewById方法耗时较大,viewholder中持有各个view控件,然后利用view的setTag,getTag直接获取View。
3- 当ListView滚动时busy设为true,停止各个view的图片加载。否则可能会让UI不够流畅用户体验度降低。(这个下载控制并不能处处用到:建议是glide的功能项目地址:https://github.com/bumptech/glide)

OnScrollListener() {  
    @Override  
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            Glide.with(mContext).resumeRequests();
        }else {
            Glide.with(mContext).pauseRequests();
        }
    }
}

4- 分页加载数据,这个网上介绍的是说一次不要请求太多数据,这个涉及的应该是list中数据很多的情况,就view本身一个页面能展示的项目有限,在滑动时,传入的convertview就是可重用(类型相同)的convertview。
image
5- 尽量能保证 Adapter 的 hasStableIds(还是有疑惑,什么情况下回返回false) 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
6- 每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item(https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/)
7- 设置 View (如 TextView#setText )之前先对比数据是否有改变。
8- ListView 中元素避免半透明,半透明绘制需要大量乘法计算,在滑动时不停重绘会造成大量的计算。实在要弄的话我个人是用个比较偷懒的方法,是在滑动的时候把半透明设置成不透明,滑动完再重新设置成半透明。
9- 在写点击时间时用new OnClickListener会创建很多listener,可以考虑创建一个listener用id来判断,或者有一种推荐方法让holder实现listener接口然后setlistener时把holder传进去。现在知道为什么会有很多地方避免new listener了。。。。 10- 尝试开启硬件加速来使ListView的滑动更加流畅。 其他基础是我:减少Item View的布局层级,getView方法尽量少使用逻辑,图片加载采用三级缓存,避免每次都要重新加载,尝试开启硬件加速来使ListView的滑动更加流畅。

使用 RecycleView 代替。ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。具体那些改善?: