使用数据绑定的具有多个视图类型的Android Receierview适配器

Android recyclerview adapter with multiple viewtype using databinding(使用数据绑定的具有多个视图类型的Android Receierview适配器)
本文介绍了使用数据绑定的具有多个视图类型的Android Receierview适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的适配器的代码片段:

 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种视图类型。是否可以添加其他也支持数据绑定的视图类型?

推荐答案

可以在一个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;
        } 
    }
}

这篇关于使用数据绑定的具有多个视图类型的Android Receierview适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)