RecyclerView 复用产生的数据混乱竟然是ConstraintLayout导致的?

首先,来看问题

正常的item中都会有页号,但是来回翻页发现会有item中不显示页号

作为资深码农,肯定了这是RecyclerView复用itemView导致的混乱,于是首先对代码检查,发现有if 的地方必有else, 本身的代码并不能导致bug的产生,如下图:

接着在pageNum.text前后均打了日志,输出了TextView的text、visible,发现一切正常!

陷入坑中了。。。

控件是visible的,是有内容的,那还有什么原因导致无法显示页号呢?

于是pageNum新增输出控件宽度,当看到日志结果,瞬间看到了曙光。

发现同一个itemView对象,pageNum的宽度会发生变化,当宽度有0、38、140。

检查布局,发现pageNum在ConstraintLayout下,layout_width = 0dp,靠左靠顶显示。因为ConstraintLayout的特性,当设置了控件的对齐方式会影响到控件的宽高,所以可以正常显示,但在itemView中涉及到了复用就产生了问题。根据日志来看是RecyclerView在显示当前页时会预载更多的数据,所以显示和预载时计算pageNum控件的宽度是不一样的,当复用时因为控件宽度已定,就造成了部分item不显示页号。

 <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/clItemBView"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_80"
        android:layout_marginLeft="@dimen/dp_5"
        android:layout_marginRight="@dimen/dp_5"
        android:layout_marginBottom="@dimen/dp_5"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_cover">
     
        <TextView
            android:id="@+id/pageNum"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/dp_10"
            android:ellipsize="end"
            android:maxLines="1"
            android:singleLine="true"
            android:text="P1"
            android:textColor="@color/c_3"
            android:textSize="@dimen/sp_21"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

 解决方法:

android:layout_width="0dp" 改为 android:layout_width="wrap_content"

总结:在使用RecyclerView时产生了数据混乱,如果检查不出是哪里的问题时,看下是否使用了ConstraintLayout,因为使用不当也会导致数据混乱。

--------------------------------------------------------------------------------------------------------------------

在解决该问题时也发现别人也遇到了ConstraintLayout导致的复用数据混乱,附上地址

https://lishide.github.io/2018/05/30/Android-fix-rv-item-view-overlap/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RecyclerView复用错乱问题是因为它的使用方式不正确所导致的。复用错乱是指在滑动RecyclerView时,列表项的数据与视图不匹配,在屏幕上显示的数据混乱或重复。 造成这个问题的常见原因有以下几点: 1. 数据源更新不及时:当数据源发生变化时,需要及时更新适配器的数据集。如果没有正确地处理数据源的变化,就会导致RecyclerView中的视图与数据不匹配。 2. 没有正确实现ViewHolder模式:RecyclerView通过重用ViewHolder来提高性能。如果没有正确实现ViewHolder模式,就会导致视图复用数据混乱。正确的做法是在ViewHolder中设置视图的数据,而不是在绑定ViewHolder时修改视图的数据。 3. 使用了错误的布局管理器:布局管理器决定了RecyclerView中列表项的排列方式。如果使用了错误或不合适的布局管理器,就会导致列表项的位置混乱或错乱。 解决RecyclerView复用错乱问题的方法有以下几点: 1. 在数据源发生变化时,及时更新适配器的数据集,并调用适配器的notifyDataSetChanged方法,通知RecyclerView进行视图更新。 2. 确保正确实现ViewHolder模式,在ViewHolder中正确地设置视图的数据。 3. 注意选择合适的布局管理器,确保列表项的位置正确排列。 4. 可以使用一些开源库或框架,如DiffUtil或DataBinding等,来简化数据源更新和视图更新的过程。 总结起来,解决RecyclerView复用错乱问题的关键是正确处理数据源的更新、正确实现ViewHolder模式、选择合适的布局管理器,并注意使用相关的开源库或框架来简化开发过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值