美文网首页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