情况是: recyclerview item里有个自定义View组件GraphView,负责显示速度曲线,假设有10条item,在切换一下底部bottombar再切换回来,发现第一条item的曲线变了,变成了第3个数据源的速度曲线。同样的操作再切一遍,发现曲线又变了,在适配正确的第一条数据源的情况下,却显示成了其他数据的速度曲线。
根本原因是: recyclerView item的布局经过动态 inflate 加载,因为复用的ViewHolder的View组件保留了之前的状态,并且重新调用OnBindViewHolder,你又没有对状态进行还原,就会出现 viewHolder 复用错乱导致的显示错误。(参考:RecyclerView 动态添加Linearlayout布局导致复用混乱问题_方长Orz的博客-CSDN博客)
故解决方案如下,在onBindViewHolder中添加如下代码:
if (binding.graphView != null) {
binding.graphView.removeAllViews();
}