android - 使用 Android LiveData 更新 RecyclerView

标签 android android-recyclerview android-livedata

有很多示例如何在 LiveData 更改时将新列表推送到适配器。

我正在尝试更新庞大列表中的一行(例如帖子的评论数)。重置整个列表以仅更改一个字段是愚蠢的。

我可以在 BindViewHolder 上添加观察者,但我不明白什么时候应该删除观察者

@Override
public void onBindViewHolder(ViewHolder vh, int position) {
    Post post = getPost(position);
    vh.itemView.setTag(post);
    post.getLiveName().observeForever(vh.nameObserver);
    ... 
}

最佳答案

就像@Lyla所说,你应该在Fragment或Activity中观察整个列表作为LiveData,当接收到变化时,你应该通过DiffUtil将整个列表设置为适配器。

假码:

PostViewModel {
    LiveData<List<Post>> posts;  // posts comes from DAO or Webservice
}

MyFragment extends LifecycleFragment {
    PostAdapter postAdapter;

    ...

    void onActivityCreated() {
        ...
        postViewModel.posts.observer(this, (postList) -> {
            postAdapter.setPosts(postList);
        }
    }       
}

PostAdapter {
    void setPosts(List<Post> postList) {
        DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {...}
        ...
    }
}

关于android - 使用 Android LiveData 更新 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44489235/

相关文章:

android-livedata - 如何使用liveData协程 block

android - 可以使用每次返回新 LiveData 的存储库功能从 UI 刷新 LiveData?

android - 如何使用这个 Android 模拟器 Bug 补丁?

java - 管理 RecyclerView 中 View 的回收方式

android - RecyclerView 项目触摸突出显示

android - 如何在布局xml中添加recyclerview

unit-testing - MediatorLiveData 在 JUnit 测试中不起作用?

java - 如何将 csv 文件中的数据打印到第二个 Activity 上?

android - 像硬件后退按钮一样启用操作栏后退按钮

android - 由于未完成的声明而无法关闭 Android