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

2023-12-23

是否可以在我的适配器中创建多个视图类型。例如为我的标题添加视图,然后标题下方是一个列表。

我的适配器的代码片段:

 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 中使用多个绑定。 以下是具有 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;
        } 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用数据绑定具有多个视图类型的 Android recyclerview 适配器 的相关文章

随机推荐

  • 暂停时的 onClick 或 onItemClick 会导致“IllegalStateException:无法在 onSaveInstanceState 之后执行此操作”

    我有一个TabActivity其中托管 5xFragmentActivity 其中一些包含按钮或列表 在它们的onClick or onItemClick 创建并推送一个新片段 在大多数情况下 这工作正常 但如果事情有点反应迟钝 或者测试人
  • C++ 删除移动赋值运算符编译问题

    以下代码在 gcc 4 8 0 mingw w64 中失败 并带有 O2 std c 11 frtti fexceptions mthreads include
  • IA-32 中的寻址模式

    我搜索过IA 32中的寻址模式 但没有看到任何网站或文章对寻址模式进行简单的解释 我需要一篇文章或其他东西来简单地通过内存变化期间的一些图片来解释这个问题 并通过图片指定地址模式 我知道在 IA 32 中 寻址的一般形式遵循以下形式 线段
  • Javabean 和 EJB 之间的区别[重复]

    这个问题在这里已经有答案了 只是一个相对 Java 新手的一个简单问题 JavaBean 和 EJB 之间有什么区别 Java bean 只是一组约定 EJB 是 J2EE 业务组件的标准 具体来说是一个 Java bean 有一个公共默认
  • 如何包含特定于页面的 JavaScript?

    在我的 Rails 应用程序中 每个页面都包含以下所有 JavaScriptassets 一些自定义脚本适用于 Ajax 和一些奇特的东西 它们不必要地从每个页面运行 并导致我不必要的过载 例如 会话页面实际上根本不需要任何 JavaScr
  • 单个 for 循环中的多个计数器:Python

    Python 中是否可以像 C C 一样在单个 for 循环中运行多个计数器 我想要类似的东西 for i j in x range 0 len x 我知道 Python 对此有不同的解释以及为什么 但是我如何在一个 for 循环中同时运行
  • Rank 和 unrank 与约束的组合

    我想使用元素距离约束对组合进行排名和取消排名 所选元素不能重复 例如 n 10元素选择 k 5被选择的元素 d 32 个选定元素之间的最大距离 1 3 5 8 9匹配约束条件 1 5 6 7 8与约束不匹配 如何对具有给定距离约束的组合进行
  • org.json.simple.JSONObject VS org.json.JSONObject , JSONException 无法解析为类型

    第一 有人可以解释一下两者之间的差异吗 org json simple JSONObject and org json JSONObject 第二 我有一个代码org json JSONObject and org json JSONExc
  • 堆栈溢出:线程1:EXC_BAD_ACCESS(代码=2,地址=0x16d09aa00)

    崩溃描述 最近 我在我的一个 iOS Swift 项目中遇到了一种非常奇怪的内存问题 我真的不知道发生了什么 也觉得不太容易描述 但无论如何我会尽力的 它的行为基本上如下 在某个代码库上 崩溃总是发生在同一个地方 100 可重现 更改代码库
  • Anaconda:IPython/Jupyter Notebook 中的 Python 3 和 2

    我安装了 Anaconda 的 Python 3 并且希望能够在 python2 和 3 内核之间快速切换 这是在 OSX 上 到目前为止我的步骤包括 conda create p anaconda envs python2 python
  • Python re.sub() 行首锚定

    考虑以下多行字符串 gt gt print s shall i compare thee to a summer s day thou art more lovely and more temperate rough winds do sh
  • 我们如何检查一个数组是否包含#中另一个数组的一个或多个元素?

    我有一个字符串数组 例如 string names P A B G F K R 我有另一个数组 string subnames P G O 我们如何检查名称数组是否包含子名称数组的任何元素 在上面的示例中 名称中存在 P 和 G 这是一个
  • Bash:检查是否按下了 Enter

    How can I check in Bash if the Enter key has been pressed I m using the read command read p Please press ENTER var 首先检查退
  • 使用 argparse 解析字符串

    所以我希望argparse的输入是一个字符串而不是命令行 例如 python3 some script py arg1 arg2 arg3 我想给 argparse 字符串 arg1 arg2 arg3 import argparse co
  • 从浏览器历史记录中删除当前页面

    我正在我的网站上构建一个文本编辑器 工作流程如下 In list 用户从列表中选择他们想要编辑的条目 该列表会将他们带到 edit article id 用户完成工作 然后单击 提交 服务器处理该事物 并将它们重定向回 edit artic
  • Nuxt 为所有动态路由生成带有后备文件的静态站点

    我已经在整个互联网上搜索了我的问题的答案 到目前为止还没有运气 我想要实现的目标 我有一个在通用模式下运行的 Nuxt 应用程序 它就像一个小型社交网络 用户可以在其中创建自己的个人资料并分享他们的工作 因此 我正在使用动态路由 users
  • 我如何清理 mysql 上的临时表

    我们在程序中创建临时表 并且我们不使用 mysql 的持久连接 mysql重启后 有很多临时表慢慢增加 然后innodb buffer pool size正在整理 应用程序正在该服务器上运行 CPU E3 1245 v5 3 50GHz 8
  • 如何远程检查 RedisCloud 数据库中的数据?

    我使用 Heroku 托管一个简单的 Ruby on Rails 测试应用程序来学习如何使用 Redis 我使用 RedisCloud 作为我的 Redis 服务提供商 在本地 我可以使用 Redis CLI 检查我的 Redis 数据库
  • 如何为 Webstorm 编写自己的插件?

    我想为 WebStorm 编写一个专门的插件 可以为自定义框架提供帮助 有关于如何做到这一点的教程吗 没有可用的 WebStorm 特定指南 插件的创建方式与 IntelliJ IDEA 完全相同 http confluence jetbr
  • 使用数据绑定具有多个视图类型的 Android recyclerview 适配器

    是否可以在我的适配器中创建多个视图类型 例如为我的标题添加视图 然后标题下方是一个列表 我的适配器的代码片段 public class StoreAdapter extends RecyclerView Adapter