LRecyclerView 常见的错误分析及解决记录

最近开发的项目中在用 LRecyclerView ,但是项目由于使用的方法不恰当或者是 LRecyclerView 本身存在的一些问题,导致 APP 发生 crash,在此大致总结记录一下。

首先我们要知道 LRecyclerView 的 Adapter 是 实际上有两个, 首先是内部自用方便 header 管理的 LRecyclerViewAdapter ,然后是我们实际上操作的 innerAdapter。 这种写法虽然巧妙,但是在使用中并不是很友好,有可能你需要同时调用两个 adapter 的 notifyDataSetChanged 方法,你的列表数据才会刷新,还有可能操作不当导致 App crash,下面记录一下我们项目在使用中的一些错误记录。


下面 提到的 外部 adapterLRecyclerView 的 LRecyclerViewAdapter

1. LRecyclerview 自动滚动到 content 部分 的问题 (整个列表包括 header + content , header 包括[banner + list ])

原因: banner 和 content 是不同的接口,并且 banner 部分包含一个 list,如果banner没数据 则会调用LoadSuccess 方法 显示 recycleriew,然后 content 数据从服务器返回后,要添加到 banner 中的 list 和 content 中,此时只调用 loadsuccess 并不会刷新 header 中的 item项,因为 LRecyclerView 中的 adapter 中跳过了header的 onBindViewHolder 方法,并且 在外部调用的 adapter 刷新,实际上只是调用的 LRecyclerView 中的 innerAdapter 刷新,外部的adapter 实际上并不会刷新。


解决方法: 
    1. 去掉 banner 方法中调用 loadSuccess 方法显示 RecyclerView ,只在 content 接口数据返回时,才调用 loadSuccess 方法,显示 RecyclerView
    2. 在 content 数据返回后,调用 LRecyclerView 的外层 adapter 和 innerAdapter 同时调用 notifyDataSetChanged 刷新。

2. tablayout + viewpager2 页面切换 crash 的问题
原因: 数据刷新 只调用了 innerAdapter 的刷新方法,并没有调用 外部 adapter 刷新方法,此时并不会正常刷新数据,导致RecyclerView 缓存错乱,会报类似于

java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{742af16 position=40 id=-1, oldPos=-1, pLpos:-1} 这种错误


    解决方法: 
    1. 每次刷新的时候 调用 LRecyclerView 的外层 adapter 和 innerAdapter 同时调用 notifyDataSetChanged 刷新。
    2. 设置 viewPager2 的 setOffscreenPageLimit 为 tab 的 个数

3. LRecyclerView header 重复添加
    在LRecyclerViewAdapter中mHeaderTypes是public static 的,多个页面的HeaderType会累加导致 viewHolder views must not be attached when created.错误
    解决方法: 将 mHeaderTypes 对象 改为 private 的即可解决。
    

暂时就这样。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页