美文网首页
列表类控件卡顿优化

列表类控件卡顿优化

作者: ChasonC | 来源:发表于2017-06-23 18:45 被阅读846次

1、使用ConstraintLayout减少布局层级。

2、可以的话,设置RecyclerView布局等高,然后设置recyclerView.setHasFixedSize(true)这样可以避免每次绘制Item时,不再重新计算Item高度。

3、根据需求修改RecyclerView默认的绘制缓存选项

 recyclerView.setItemViewCacheSize(20);
 recyclerView.setDrawingCacheEnabled(true);
 recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

4、在onBindViewHolder/getView方法中,减少逻辑判断,减少临时对象创建。例如:复用事件监听,在其方法外部创建监听,可以避免生成大量的临时变量。
减少逻辑判断参考方案:

    //优化前:
    class MyRecyclerView.Adapter extends RecyclerView.Adapter {

        static final TODAYS_DATE = new Date();
        static final DATE_FORMAT = new SimpleDateFormat("MM dd, yyyy");
        public onBindViewHolder(Task.ViewHolder tvh, int position) {
            Task task = getItem(position);
            if (TODAYS_DATE.compareTo(task.dateDue) > 0) {
                tvh.backgroundView.setColor(Color.GREEN);
            } else {
                tvh.backgroundView.setColor(Color.RED);
            }
            String dueDateFormatted = DATE_FORMAT.format(task.getDateDue());
            tvh.dateTextView.setDate(dueDateFormatted);
        }
    }
    //优化后,改写model
    public class TaskViewModel {
        int overdueColor;
        String dateDue;
    }

    public onBindViewHolder(Task.ViewHolder tvh, int position) {    
        TaskViewModel taskViewModel = getItem(position);
        tvh.backgroundView.setColor(taskViewModel.getOverdueColor());
        tvh.dateTextView.setDate(taskViewModel.getDateDue());
    }

6、避免整个列表的数据更新,只更新受影响的布局。例如,加载更多时,不使用notifyDataSetChanged(),而是使用notifyItemRangeInserted(rangeStart, rangeEnd)

7、scrollingCache=false animationCache=false(针对ListView)
scrollingCache: scrollingCache本质上是drawing cache,你可以让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,而是从cache中取出。默认情况下drawing cahce是禁用的,因为它太耗内存了,但是它确实比重画来的更加平滑。而在ListView中,scrollingCache是默认开启的,我们可以手动将它关闭。
animateCache: ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们可以手动将它关闭掉。

8、对于RecyclerView,持有item具有的独特id,可以很容易地确定具体item并单独更新,当变化发生时,可以按照如下方式更新,从而避免整体刷新:

    adapter.setHasStableIds(true);
    adapter.notifyItemRemoved(position);    
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);

参考:

https://stackoverflow.com/questions/27188536/recyclerview-scrolling-performance
https://stackoverflow.com/questions/27993627/optimizing-recyclerview-listview
另外附上一个大神写的Adapter优化:http://www.jianshu.com/p/411ab861034f 其实现有用到以上部分思路。

相关文章

  • 列表类控件卡顿优化

    1、使用ConstraintLayout减少布局层级。 2、可以的话,设置RecyclerView布局等高,然后设...

  • Runloop优化列表滑动卡顿

    Runloop优化列表滑动卡顿

  • iOS优化

    性能优化一般分为两类: 业务逻辑实现优化 卡顿情况优化 卡顿情况优化方式 合理的线程由于GCD太方便了,如果不加控...

  • 卡顿优化

    卡顿优化 - CPU 卡顿优化 - GPU 离屏渲染 卡顿检测 耗电优化

  • 21-性能优化

    一、CPU和GPU 二、卡顿产生的原因和优化 卡顿优化-CPU 卡顿优化-GPU 卡顿监测 监控卡顿的demo:推...

  • iOS底层原理 - 性能优化 之 卡顿优化

    面试题引发的思考: Q: 列表卡顿的原因?如何优化? 卡顿主要是因为在 主线程 执行了 比较耗时 的操作。 Q: ...

  • iOS面试——项目篇

    性能相关 1- 项目中造成Tableview等列表滑动卡顿的原因有哪些?你是如何优化的? 答:造成卡顿的原因主要由...

  • iOS 列表卡顿优化记录

    首先介绍出现问题场景:实时聊天的群聊列表,消息过来会进行频繁刷新,在压力测试下,大约0.5s会刷新一次。列表中包含...

  • Android列表优化,可以参考参考

    OrderList 优化列表,大量数据也不会造成卡顿,代码简洁可读性高 使用AutoSwipeRefreshLay...

  • 十. 其它优化

    一. 列表卡顿优化 常规方案 convertView复用、使用ViewHolder 耗时任务异步处理 布局相关 减...

网友评论

      本文标题:列表类控件卡顿优化

      本文链接:https://www.haomeiwen.com/subject/ksyoqxtx.html