【发布时间】:2019-10-14 03:38:38
【问题描述】:
我正在试验架构组件,我想为 RecyclerView 的每个项目构建一个 ViewModel。我不确定这在形式上是否正确,或者我应该坚持“旧方式”。
我有这个适配器:
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
private List<Post> list;
public static class PostViewHolder extends RecyclerView.ViewHolder{
final ItemPostBinding binding;
public PostViewHolder(ItemPostBinding binding){
super(binding.getRoot());
this.binding = binding;
}
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemPostBinding binding = DataBindingUtil
.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_post,
parent, false);
return new PostViewHolder(binding, parent.getContext());
}
@Override
public void onBindViewHolder(PostViewHolder holder, int position) {
holder.binding.setPost(list.get(position));
holder.binding.executePendingBindings();
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
public void setList(List<Post> list){
this.list = list;
notifyDataSetChanged();
}
}
效果很好,但它非常基本。如何更新它,以便每个项目都有自己的 ViewModel 关联?这有可能吗?
编辑:玩它,我尝试通过以下方式放入 ViewModel:
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
private List<Post> list;
public static class PostViewHolder extends RecyclerView.ViewHolder{
final ItemPostBinding binding;
private final Context context;
private GalleryItemViewModel viewModel;
public PostViewHolder(ItemPostBinding binding, Context context){
super(binding.getRoot());
this.binding = binding;
this.context = context;
}
public Context getContext(){
return context;
}
public void setViewModel(GalleryItemViewModel viewModel){
this.viewModel = viewModel;
binding.setViewModel(viewModel);
}
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemPostBinding binding = DataBindingUtil
.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_post,
parent, false);
return new PostViewHolder(binding, parent.getContext());
}
@Override
public void onBindViewHolder(PostViewHolder holder, int position) {
GalleryItemViewModel vm = ViewModelProviders.of((FragmentActivity) holder.getContext()).get(GalleryItemViewModel.class);
vm.setPost(list.get(position));
holder.setViewModel(vm);
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
public void setList(List<Post> list){
this.list = list;
notifyDataSetChanged();
}
}
它有效,但这是正确的方法吗?
【问题讨论】:
-
你好 Jacopo,你可以用不同的方式使用适配器..
-
你能给我一个例子或链接吗?
-
您可以从下面的链接stackoverflow.com/questions/47432835/…查看答案
-
如果你觉得有问题再问我...
-
ViewModelProviders.of((FragmentActivity) holder.getContext()).get(GalleryItemViewModel.class)这不会在后续调用中返回相同的GalleryItemViewModel对象吗?我猜你应该使用ViewModelProvider的重载方法get(@NonNull String key, @NonNull Class<T> modelClass)并通过唯一键来获得每个onBindViewHolder调用的唯一视图模型。
标签: android mvvm android-recyclerview android-architecture-components