引言
最近使用RecyclerView 数据刷新出现数据错乱问题。
为了Tv上开发防止数据刷新丢失焦点及图片重新加载,设置了setHasStableIds(true)导致数据错乱,我在Adapter中重写了getItem()的方法后数据倒是正常了。
可使用notifyInserted notifyItemRemoved还是数据错乱,最终去除了setHasStableIds(true),动画才正常。但图片会重新加载,焦点会丢失。
现在还是不知道如何兼顾焦点不丢失和notify动画正常执行。
找到解决方法了:
getItemId不使用position,使用对象的hashcode值,即可解决以上问题。
@Override
public long getItemId(int position) {
return mDatas.get(position).hashCode();
}
如果数据源是基本数据类型或者String,使用新建一个实体包一层即可。
public class Data {
private String des;
public Data(String des) {
this.des = des;
}
@Override
public int hashCode() {
return super.hashCode();
}
public void setDes(String des) {
this.des = des;
}
public String getDes() {
return des;
}
}
坑
1.需要重载getItemId()方法,不然调用notifyItemRangeChanged方法会出现因为item复用导致的ID相同的问题。
2.使用getItemId()返回值使用对象的hashcode值。
2.notifyItemRangeChanged(int positionStart, int itemCount) 注意第二个参数是count并不是positionEnd。