Android架构组件:使用ViewModel来管理RecyclerView的项
Android架构组件:使用ViewModel来管理RecyclerView的项
我正在尝试使用Architecture Components,并且想为RecyclerView的每个项构建一个ViewModel。我不确定这是否正式正确,或者我应该坚持“旧的方法”。
我有这个适配器:
public class PostAdapter extends RecyclerView.Adapter{ private List 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 list){ this.list = list; notifyDataSetChanged(); } }
这个适配器工作得很好,但很基础。如何更新它,以便每个项都有自己关联的ViewModel?这是否可能?
编辑:尝试使用ViewModel的方式如下:
public class PostAdapter extends RecyclerView.Adapter{ private List 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 list){ this.list = list; notifyDataSetChanged(); } }
它有效,但这是否是正确的做法?