使用Android LiveData更新RecyclerView

And*_*tuk 27 android recycler-adapter android-livedata

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

我正在尝试在巨大的列表中更新一行(例如,帖子的评论数量).重置整个列表只更改一个字段是愚蠢的.

我能够添加观察者onBindViewHolder,但我无法理解何时应该删除观察者

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

Spa*_*Bao 14

就像@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() {...}
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不建议在观察者中使用 MyFragment 作为“this”。这背后的原因是当片段进入后台堆栈时,片段不会被销毁。因此,具有不同实例的相同片段将观察到此实时数据。更好的方法是使用 getViewLifecycleOwner。 (3认同)

Lyl*_*yla 10

使用DiffUtil可能有助于更新巨大列表中的一行.然后,您可以让LiveData包含注释列表,而不是注释的单个注释或属性.

以下是在RecyclerView适配器中使用DiffUtil 以及片段中列表LiveData观察代码的示例.