美文网首页Android应用开发那些事
RecyclerView<第二篇>:浅谈复用机制

RecyclerView<第二篇>:浅谈复用机制

作者: NoBugException | 来源:发表于2019-10-23 15:27 被阅读0次

    使用RecyclerView,我们必须知道RecyclerView的复用机制,本文不谈复用机制原理,只谈RecyclerView复用机制必须了解的知识点。

    【知识点一】 在上层代码中,如何控制复用功能

    在我们编写RecycleView的Adapter类时,必须回调以下方法

    @Override
    public int getItemViewType(int position) {
        return position;
    }
    

    getItemViewType方法的返回值可以控制是否开启复用功能。

    一个RecycleView组件有多个Item,每个Item都有其特有类型,getItemViewType方法可以控制Item的类型。

    当它的返回值为position时,表明所有的Item的类型都不同,由于只有相同类型的Item才可以复用,所以如果它的返回值为position时,默认认为RecyclerView的复用机制是关闭的,否则复用机制开启。

    【知识点二】 复用机制的缓存有多大?

    假设getItemViewType方法的返回值为0,如下:

    @Override
    public int getItemViewType(int position) {
        return 0;
    }
    

    也就是说,RecyclerView所有的Item类型都一样。

    图片.png

    如图所示,RecyclerView列表中,能被肉眼看到的Item数量为10,那么,可以确定,在当前设备(手机)上,RecyclerView的复用缓存大小为10,这10个Item可以被无限复用,在设备缓存中,永远存在10个RecyclerView.ViewHolder对象,当滑动,增加,删除时,会有新的Item显示在屏幕上,当前缓存大小还是10。

    【知识点三】 凡是出现Item紊乱问题都是RecyclerView复用机制有关

    当使用RecyclerView组件时,为了性能优化,我们一般不会将getItemViewType的返回值设置成position,如果RecyclerView的Item只有一种类型,直接将返回值写成任意一个固定数字即可,如下:

    @Override
    public int getItemViewType(int position) {
        return 0;
    }
    

    如果是多类型,就会写成如下代码:

    @Override
    public int getItemViewType(int position) {
        if(a){
            return 0;
        }else if(b){
            return 1;
        }else{
            return 2;
        }
    }
    

    至于多类型的RecyclerView不是本文重点,多类型的RecyclerView会在后续文章中给出。

    放弃使用复用机制的话(返回值为position)不会出现Item紊乱问题,但是一旦使用了复用机制,那么将有可能偶现Item紊乱问题。

    出现紊乱的原因是:当进行删除Item,下拉,新增Item等三个操作时,新的Item会显示在设备屏幕上,此时,恰恰因为代码问题,导致发生Item的紊乱现象。

    至于怎么解决紊乱问题,请看下篇文章。

    [本章完...]

    相关文章

      网友评论

        本文标题:RecyclerView<第二篇>:浅谈复用机制

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