Android架构组件:使用ViewModel来管理RecyclerView的项

17 浏览
0 Comments

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();
    }
}

它有效,但这是否是正确的做法?

0