使用数据绑定的多视图类型Android recyclerview适配器

使用数据绑定的多视图类型Android recyclerview适配器,android,android-studio,android-recyclerview,android-adapter,android-databinding,Android,Android Studio,Android Recyclerview,Android Adapter,Android Databinding,是否可以在我的适配器中创建多视图类型。。就像为我的标题添加视图一样,标题下面是一个列表 我的适配器的代码段: public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.BindingHolder> { List<Store> mStoreList; public class BindingHolder extends RecyclerView

是否可以在我的适配器中创建多视图类型。。就像为我的标题添加视图一样,标题下面是一个列表

我的适配器的代码段:

 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();
    }
}
公共类StoreAdapter扩展了RecyclerView.Adapter{ 列出MSStoreList; 公共类BindingHolder扩展了RecyclerView.ViewHolder{ 私有视图数据绑定; 公共绑定持有者(视图v){ 超级(五); binding=DataBindingUtil.bind(v); } 公共视图数据绑定getBinding(){ 返回绑定; } } 公共存储适配器(列表存储列表){ this.mStoreList=存储列表; } @凌驾 public BindingHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.item\u row\u store,parent,false); BindingHolder=新的BindingHolder(v); 报税表持有人; } @凌驾 BindViewHolder上的公共无效(BindingHolder,int位置){ 最终存储=mStoreList.get(位置); holder.getBinding().setVariable(BR.store,store); holder.getBinding().executePendingBindings(); } @凌驾 public int getItemCount(){ 返回mstorelest.size(); } } 更多详情:


当前我的适配器仅支持1种视图类型。是否可以添加另一种也支持数据绑定的视图类型?

可以在一个ViewHolder中使用多个绑定。 下面是一个适配器示例,其中包含两种类型的项:

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;
        } 
    }
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私有静态最终整数单元格类型标头=0; 私有静态最终整数单元格类型规则项=1; 类MyViewHolder扩展了RecyclerView.ViewHolder{ 私人头像绑定头像绑定; 私人正则约束正则约束; MyViewHolder(磁头绑定){ super(binding.getRoot()); 头绑定=绑定; } MyViewHolder(正则绑定){ super(binding.getRoot()); 正则化绑定=绑定; } } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ LayoutInflater充气器=LayoutInflater.from(parent.getContext()); 视图数据绑定; 开关(视图类型){ 案例单元类型标题: 绑定=数据绑定直到充气(充气器,右布局标题,父项,false); 返回新的MyViewHolder((标题绑定)绑定); 案例单元类型常规项目: 绑定=数据绑定直到充气(充气器,R.layout.regular\u项目,父项,false); 返回新的MyViewHolder((RegulationBinding)绑定); } 返回null; } @凌驾 公共无效onBindViewHolder(MyViewHolder,int位置){ MyViewModel viewModel=新的MyViewModel(getItem(position)); 开关(holder.getItemViewType()){ 案例单元类型标题: 磁头绑定磁头绑定=保持架。磁头绑定; viewModel.setSomething(…); headerBinding.setViewModel(viewModel); 打破 案例单元类型常规项目: RegulationMBinding RegulationMBinding=holder.RegulationMBinding; viewModel.setSomething(…); regulationMBinding.setViewModel(viewModel); 打破 } } @凌驾 public int getItemViewType(int位置){ 如果(位置==0){ 返回单元格类型标题; }否则{ 返回单元格\类型\常规\项目; } } }
这个问题已经在其他几个地方得到了回答。是的。。但是我没有看到任何关于数据绑定的帖子,可能是伟大的复制品!如何从ViewHolder获取绑定实例,该实例不是空的?@MohsinFalak您可以为绑定引用提供getter或将其公开。问题是,我有多个绑定(对于消息列表,一个是右向的,另一个是左向的,没有其他区别)对于同一个ViewHolder,我想访问ViewHolder外部的活动绑定,我该怎么做?能否为您的案例添加一段(简化的)代码?请查看以下内容: