Android知识Android开发Android技术知识

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

上一篇下一篇

猜你喜欢

热点阅读