美文网首页高级UI
RecyclerView<第三篇>:怎样防止Item紊乱现象

RecyclerView<第三篇>:怎样防止Item紊乱现象

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

    在大型项目中,由于逻辑混杂,有时候因为代码问题导致RecyclerView的Item紊乱,那么该怎么从杂乱的代码中解决Item紊乱问题呢?

    【解决方案一】 adapter中有一个getItemViewType方法,将这个方法的返回值改成position就可以做到100%防止Item紊乱问题,原理是:列表中所有Item的view类型都不同,可以保证在任何时候都能执行onBindViewHolder,也就是;

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

    但是如果真的这样做,就失去了Recyclerview Item复用的特性,这样消耗的内存也是非常大的。如果您能够保证Recyclerview的数据量比较少,那么这个方法倒是不错的。

    【解决方案二】 有时候Recyclerview加载的数据量是比较多的,显然这时将getItemViewType的返回值改成position将大大影响性能。那么我们将它的返回值改成0或者默认的固定值,即所有的Item的类型一致,所有的IItem都可以用来复用,大大减少了内存的消耗,但是这种情况代码稍微写的不恰当就容易导致Item紊乱问题,解决这个问题还需要从代码入手。

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

    场景1:加载本地图片(或网络图片)
    在onBindViewHolder中的写法如下

    if(图片存在){
          //加载已存在的图片
     }
    

    场景2:姓名展示
    在onBindViewHolder中的写法如下

    if(存在姓名){
          //加载已存在的姓名
     }
    

    如果getItemViewType返回的是固定值时,基本上可以确定这两种场景都会发生100%紊乱,解决方案如下:

    场景1:加载本地图片(或网络图片)
    在onBindViewHolder中的写法如下

    if(图片存在){
          //加载已存在的图片
     }else{
          //加载默认的图片
     }
    

    场景2:姓名展示
    在onBindViewHolder中的写法如下

    if(存在姓名){
          //加载已存在的姓名
     }else{
          //加载默认的姓名
     }
    

    也就是说,如果getItemViewType返回的是固定值时,解决紊乱的问题必须从数据处理着手。

    [本章完...]

    相关文章

      网友评论

        本文标题:RecyclerView<第三篇>:怎样防止Item紊乱现象

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