有很多示例如何在 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/