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)
Lyl*_*yla 10
使用DiffUtil可能有助于更新巨大列表中的一行.然后,您可以让LiveData包含注释列表,而不是注释的单个注释或属性.
以下是在RecyclerView适配器中使用DiffUtil 以及片段中的列表LiveData观察代码的示例.
| 归档时间: |
|
| 查看次数: |
21060 次 |
| 最近记录: |