使用DiffUtils刷新RecyclerView失败
2017-07-15 本文已影响166人
fuuuuuccccck
最近在使用DiffUtils刷新Recyclerview的时候,发现有时候UI不会更新,但是上下滑动后就会变成最新的了,说明数据是最新的了。
由于项目中是详情里的某些操作,需要更新外部item的某些数字变化(有点类似进微博详情评论后,回来列表会看到评论数+1的情况)
一开使我用A手机停在列表,B手机在详情里操作,发现A的列表更新正常,但是B返回列表时并不会更新。我就往操作用户这方面找bug,是不是因为某些判断错误,比如当这个操作是本人所为时,没有更新列表。查找了一段时间,没有查询到原因。
后来试了一下,我AB手机都在详情里,B操作后,A返回列表,发现UI也没有更新。只有当A在列表页面时,B的操作才会使A的列表即时刷新。
然后开始猜想,是不是因为这个View不是显示状态(不是RecyclerView的回收,而是Activity的pause状态)导致DiffResult误以为,这个item是被回收了,然后我就改成了另一个方式,当需要刷新时,我设置一个参数needUpdate为true,然后在onResume的方法里,判断needUpdate是否为true,为true的时候才更新,发现这样就没有问题了
@Subscribe(threadMode = ThreadMode.MAIN)
public void onChatEvent(MyCommonEvent myCommonEvent) {
if (myCommonEvent.isWebsocket()) {
initChat();
return;
}
if (myCommonEvent.isGroupChanged()) {//需要刷新时,设置为true
needUpdate = true;
goToUpdate();
}
}
boolean needUpdate;
@Override
protected void onUserVisible() {
super.onUserVisible();
goToUpdate();
}
@Override
public void onResume() {
super.onResume();
goToUpdate();
}
private void goToUpdate() {
if (needUpdate && isResumed() && isUserVisible() ) {
needUpdate = false;
roomAdapter.update();
showState();
}
}