使用DiffUtils刷新RecyclerView失败

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,090评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 27,684评论 5 19
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 5,212评论 0 16
  • 蝉鸣蛙鼓一夜息, 晓露微凉湿轻衣。 犹是骄阳当空日, 荫下清凉秋来袭。
    洛灬尘阅读 208评论 0 0