使用数据绑定的具有多个视图类型的 Android recyclerview 适配器
Posted
技术标签:
【中文标题】使用数据绑定的具有多个视图类型的 Android recyclerview 适配器【英文标题】:Android recyclerview adapter with multiple viewtype using databinding 【发布时间】:2017-06-06 00:48:30 【问题描述】:是否可以在我的适配器中创建多视图类型。就像为我的标题添加一个视图,然后标题下方是一个列表。
我的适配器的代码 sn-p :
public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.BindingHolder>
List<Store> mStoreList;
public class BindingHolder extends RecyclerView.ViewHolder
private ViewDataBinding binding;
public BindingHolder(View v)
super(v);
binding = DataBindingUtil.bind(v);
public ViewDataBinding getBinding()
return binding;
public StoreAdapter(List<Store> storeList)
this.mStoreList = storeList;
@Override
public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType)
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row_store, parent, false);
BindingHolder holder = new BindingHolder(v);
return holder;
@Override
public void onBindViewHolder(BindingHolder holder, int position)
final Store store = mStoreList.get(position);
holder.getBinding().setVariable(BR.store, store);
holder.getBinding().executePendingBindings();
@Override
public int getItemCount()
return mStoreList.size();
更多细节:
目前我的适配器仅支持 1 种视图类型。是否可以添加另一种也可以支持数据绑定的视图类型?
【问题讨论】:
这个问题已经在here和其他几个地方得到了回答。 是的.. 但我没有看到任何带有数据绑定的帖子 How to create RecyclerView with multiple view type?的可能重复 【参考方案1】:可以在一个 ViewHolder 中使用多个绑定。 以下是具有 2 种项目的适配器示例:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
private static final int CELL_TYPE_HEADER = 0;
private static final int CELL_TYPE_REGULAR_ITEM = 1;
class MyViewHolder extends RecyclerView.ViewHolder
private HeaderBinding headerBinding;
private RegularItemBinding regularItemBinding;
MyViewHolder(HeaderBinding binding)
super(binding.getRoot());
headerBinding = binding;
MyViewHolder(RegularItemBinding binding)
super(binding.getRoot());
regularItemBinding = binding;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
ViewDataBinding binding;
switch (viewType)
case CELL_TYPE_HEADER:
binding = DataBindingUtil.inflate(inflater, R.layout.header, parent, false);
return new MyViewHolder((HeaderBinding) binding);
case CELL_TYPE_REGULAR_ITEM:
binding = DataBindingUtil.inflate(inflater, R.layout.regular_item, parent, false);
return new MyViewHolder((RegularItemBinding) binding);
return null;
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
MyViewModel viewModel = new MyViewModel(getItem(position));
switch (holder.getItemViewType())
case CELL_TYPE_HEADER:
HeaderBinding headerBinding = holder.headerBinding;
viewModel.setSomething(...);
headerBinding.setViewModel(viewModel);
break;
case CELL_TYPE_REGULAR_ITEM:
RegularItemBinding regularItemBinding = holder.regularItemBinding;
viewModel.setSomething(...);
regularItemBinding.setViewModel(viewModel);
break;
@Override
public int getItemViewType(int position)
if (position == 0)
return CELL_TYPE_HEADER;
else
return CELL_TYPE_REGULAR_ITEM;
【讨论】:
太棒了!如何从不为空的 ViewHolder 中获取绑定实例? @MohsinFalak 您可以为绑定引用设置 getter 或将其公开。 问题是,对于同一个 ViewHolder,我有多个绑定(对于消息列表,一个是右向,另一个是左向,没有其他区别),我想访问视图外的活动绑定,我该怎么做? 您可以为您的案例添加一段(简化的)代码吗? 请看这个:***.com/questions/64164201/…以上是关于使用数据绑定的具有多个视图类型的 Android recyclerview 适配器的主要内容,如果未能解决你的问题,请参考以下文章
数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity
MVC 3 Razor Form Post w/ 多个强类型的部分视图不绑定