首页 > 其他分享 >RecyclerView详解

RecyclerView详解

时间:2022-12-21 08:33:43浏览次数:40  
标签:ViewHolder RecyclerView 复用 详解 convertView holder view

1:和Listview的不同:

1)Listview只支持纵向列表,RecyclerVeiw支持纵向、横向、网格以及瀑布流;

2)ListView是2级缓存机制,RecyclerView是4级缓存机制

3)ListView没有强制实现ViewHolder

2:ListView:

用法:

@Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.simple_item, null);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.merchant_name);
                holder.iv = (ImageView) convertView.findViewById(R.id.head);
                convertView.setTag(holder);//绑定ViewHolder对象
            } else {
                holder = (ViewHolder) convertView.getTag();//取出ViewHolder对象
            }
            holder.text.setText(listems.get(position));
            holder.iv.setImageBitmap(imgId.get(position));
            holder.text.setTag(position);
            holder.iv.setTag(convertView);
            return convertView;
        }

缓存机制:

1)屏幕内的view复用:屏幕每16ms刷新一次,需要重新绘制,item可以直接复用,不需要重新绑定数据,不执行getview

2)屏幕外的view复用:view的数据是脏数据,执行getView,传进来的convertView不为空,但是需要重新绑定数据

3)创建新的view:执行getView,传进来的convertView为空,需要创建新的view

ViewHolder:

1)ViewHolder的作用不是为了 复用,ListView、RecyclerView本身就有复用机制,不用ViewHolder,一样是复用view。

ViewHolder是为了避免过多的findViewById操作,这是需要消耗性能的

2)一个view对应一个ViewHolder

 

RecyclerView:

用法:

public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.id_card_recyclerview_item_home, viewGroup,
                false));
            return holder;
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            ((MyViewHolder) viewHolder).date.setText(context.getString(R.string.id_history_date) + ":" + idHistoryRecords.get(i).getDate());
            ((MyViewHolder) viewHolder).time.setText(context.getString(R.string.id_history_time) + ":" + idHistoryRecords.get(i).getTime());
            ((MyViewHolder) viewHolder).transactionNo.setText(idHistoryRecords.get(i).getTransactionNo());
        }

缓存机制:4级:

1)屏幕内的vie复用,对应Listview的第一点,屏幕每16ms刷新一次,需要重新绘制,item可以直接复用,不需要重新绑定数据,不执行onCreateViewHolder和onBindViewHolder

2)超出屏幕外2个的item复用,可以直接复用,不需要重新绑定数据,不执行onCreateViewHolder和onBindViewHolder

3)RecyclerViewPool的view复用,默认5个,可以自行设置,是脏数据,需要重新绑定数据,执行onBindViewHolder

4)还有一级缓存不常用的,不研究

5)创建新的view,执行onCreateViewHolder

 

RecyclerViewPool:

ViewPager和RecyclerViewPool配合,可以最大程度对view进行复用

性能优化:

1).合理设置RecyclerViewPool的大小。如果一屏的item较多,那么RecyclerViewPool的大小就不能再使用默认的5,可适度增大Pool池的大小。如果存在RecyclerView中嵌套RecyclerView的情况,可以考虑复用RecyclerViewPool缓存池,减少开销

2)不要在onBindViewHolder里面设置监听,因为RecyclerViewPool复用的数据脏数据,会反复调用。应该在onCreteView里面设置监听,每个view肯定都会经历一次creatView,view和clicklistener一一对应,view和holder对应达到效果。

3)数据处理与视图绑定分离,去除onBindViewHolder方法里面的耗时操作,只做纯粹的数据绑定操作。当程序走到onBindViewHolder方法时,数据应当是准备完备的,禁止在onBindViewHolder方法里面进行数据获取的操作。

4)对于固定尺寸的item,可以使用setHasFixedSize避免requestLayout

标签:ViewHolder,RecyclerView,复用,详解,convertView,holder,view
From: https://www.cnblogs.com/wnpp/p/16995465.html

相关文章

  • 大端和小端模式详解
    前言对于不了解的看到或者听到“大端”、“小端”就如我一样可能就会很懵,不知道是啥?网上很多文章看的是眼花缭乱,云里雾里,所以本人决定自己写一篇让和我一样经历困惑的人,能......
  • 高性能Mysql主从架构的复制原理及配置详解(转)
    温习《高性能​​MySQL​​》的复制篇.1复制概述     Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过......
  • Spring MVC 拦截器实现登录拦截以及多拦截器的配置执行详解
    持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第25天,点击查看活动详情前言上一篇文章我们简单了解并完成了SpringMVC拦截器的入门案例,这一篇文章,我们......
  • const成员,流插入,流提取重载,初始化列表! 流插入,流提取的重载(6千字长文详解!)
    c++详解之const成员,流插入,流提取重载,初始化列表!<<流插入和>>流提取的重载#include<iostream>usingnamespacestd;intmain(){inta=0;doubleb=1.......
  • 深入原型链与继承(详解JS继承原理)
    目录原型链与继承new关键字的执行过程构造函数、实例对象和原型对象原型链的概念及图解第一层__proto__指向:实例对象第二层__proto__指向:Function.prototype和Foo.prototy......
  • vue.nextTick()方法的使用详解
    1,什么是Vue.nextTick()理解:nextTick(),是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数,1<template>2<divclass......
  • 开关量、模拟量、脉冲量分不清楚?PLC最全编程算法详解,看完彻底懂了!
    PLC中无非就是三大量:开关量、模拟量、脉冲量。只在搞清楚三者之间的关系,你就能熟练的掌握PLC了。开关量的计算1、开关量也称逻辑量,指仅有两个取值,0或1、ON或OFF。它是最......
  • 二阶段目标检测网络-Cascade RCNN 详解
    摘要1,介绍1.1,FasterRCNN回顾1.2,mismatch问题2,实验分析2.1,改变IoU阈值对Detector性能的影响2.2,提高IoU阈值的影响2.3,和IterativeBBox比较3,网络结构参考......
  • Java内部类详解
    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法......
  • 第01期:详解 Prometheu 专栏开篇
    开篇致辞大家好,从今天开始,我将开启一个全新的专栏叫做《详解Prometheus》。专栏会详细介绍Prometheus这款优秀的开源监控告警系统的使用,欢迎感兴趣的小伙伴关注!一、产品......