使用DiffUtils刷新RecyclerView失败

作者: fuuuuuccccck | 来源:发表于2017-07-15 11:47 被阅读166次

    最近在使用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();
            }
        }
    
    

    相关文章

      网友评论

        本文标题:使用DiffUtils刷新RecyclerView失败

        本文链接:https://www.haomeiwen.com/subject/grbahxtx.html