首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

onBindViewHolder函数中Android RecyclerView多视图的公共持有者变量

onBindViewHolder函数是RecyclerView中的一个重要方法,用于绑定数据到视图上。在使用多视图的情况下,我们需要定义一个公共持有者变量来存储不同类型视图的引用。

公共持有者变量可以是一个抽象的基类或接口,用于表示不同类型视图的共同特征。通过定义一个公共持有者变量,我们可以在onBindViewHolder函数中根据不同的视图类型来进行类型转换,并将数据绑定到相应的视图上。

在Android中,使用RecyclerView的多视图功能可以实现复杂的列表布局,例如在一个列表中同时显示图片和文字,或者在一个列表中显示不同类型的卡片等。通过使用多视图,我们可以根据不同的数据类型和需求来选择合适的视图类型,并将数据正确地展示出来。

以下是一个示例代码,展示了如何在onBindViewHolder函数中使用公共持有者变量来处理多视图:

代码语言:txt
复制
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<Object> mDataList;

    // 定义多个视图类型的常量
    private static final int VIEW_TYPE_IMAGE = 0;
    private static final int VIEW_TYPE_TEXT = 1;

    // 定义公共持有者变量
    public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
        public BaseViewHolder(View itemView) {
            super(itemView);
        }

        public abstract void bindData(Object data);
    }

    // 定义图片视图持有者
    public class ImageViewHolder extends BaseViewHolder {
        private ImageView mImageView;

        public ImageViewHolder(View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.image_view);
        }

        @Override
        public void bindData(Object data) {
            // 绑定图片数据到ImageView
            // ...
        }
    }

    // 定义文字视图持有者
    public class TextViewHolder extends BaseViewHolder {
        private TextView mTextView;

        public TextViewHolder(View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.text_view);
        }

        @Override
        public void bindData(Object data) {
            // 绑定文字数据到TextView
            // ...
        }
    }

    @Override
    public int getItemViewType(int position) {
        // 根据数据类型返回对应的视图类型
        Object data = mDataList.get(position);
        if (data instanceof ImageData) {
            return VIEW_TYPE_IMAGE;
        } else if (data instanceof TextData) {
            return VIEW_TYPE_TEXT;
        }
        return super.getItemViewType(position);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 根据视图类型创建对应的视图持有者
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == VIEW_TYPE_IMAGE) {
            View itemView = inflater.inflate(R.layout.item_image, parent, false);
            return new ImageViewHolder(itemView);
        } else if (viewType == VIEW_TYPE_TEXT) {
            View itemView = inflater.inflate(R.layout.item_text, parent, false);
            return new TextViewHolder(itemView);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        // 根据视图类型绑定数据到对应的视图持有者
        Object data = mDataList.get(position);
        if (holder instanceof ImageViewHolder) {
            ((ImageViewHolder) holder).bindData(data);
        } else if (holder instanceof TextViewHolder) {
            ((TextViewHolder) holder).bindData(data);
        }
    }

    @Override
    public int getItemCount() {
        return mDataList.size();
    }
}

在上述示例中,我们定义了一个MyAdapter类,继承自RecyclerView.Adapter,并使用泛型指定了ViewHolder的类型为RecyclerView.ViewHolder。在getItemViewType函数中,我们根据数据类型返回对应的视图类型。在onCreateViewHolder函数中,我们根据视图类型创建对应的视图持有者。在onBindViewHolder函数中,我们根据视图类型将数据绑定到对应的视图持有者。

这样,我们就可以在RecyclerView中使用多视图功能,并通过公共持有者变量来处理不同类型的视图。这种方式可以提高代码的可维护性和扩展性,使得我们可以方便地添加新的视图类型或修改已有的视图类型。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云官网:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb-for-mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云物联网平台(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 移动开发平台(MTP):https://cloud.tencent.com/product/mtp
  • 腾讯云音视频处理(MPS):https://cloud.tencent.com/product/mps
  • 腾讯云网络安全(NSA):https://cloud.tencent.com/product/nsa
  • 腾讯云音视频通信(TRTC):https://cloud.tencent.com/product/trtc
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门(23)适配器进阶表达

前面在介绍列表视图和网格视图时,它们适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应视图对象。...视图持有者设计理念固然美好,却苦了Android开发者,每次由BaseAdapter派生新适配器类,都必须手工处理视图持有者相关逻辑,实在是个沉重负担。...有鉴于此,循环视图适配器把视图持有者重用逻辑剥离出来,由系统自行判断并处理持有者重用操作。...(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder     //绑定视图持有者各个控件对象,需要子类重写     override...内部其余代码都是允许复用,因此,接下来工作就是想办法把这三个要素抽象为公共某种变量

1.8K41

揭开RecyclerView庐山真面目

谷歌在Android L中新增了RecyclerView,是一种新视图组,目标是为任何基于适配器视图提供相似的渲染方式。...使用时需要重写以下两个主要方法: onCreateViewHolder:用来展现视图和它持有者onBindViewHolder:主要用来把数据绑定到视图上。...二、RecyclerView示例 上面说了这么,估计还是很迷糊,那么接下来通过一个简单示例来进一步学习。...从上面例子可以看出来,RecyclerView用法并不比ListView复杂,反而更灵活好用,它将数据、排列方式、数据展示方式都分割开来,因此可定制型,自定义形式也非常,非常灵活。...简单修改一下自定义RecyclerViewAdapter类onBindViewHolder方法,使其产生一个随机高度,代码如下: // 将数据与界面进行绑定操作 @Override

1.7K80

Android开发笔记(一百二十二)循环器视图RecyclerView

RecyclerView RecyclerViewAndroid在support-v7库中新推出控件,中文别名为循环器视图,它功能非常强大,可分别实现ListView、GridView,以及瀑布流网格显示效果...RecyclerView相关工程在sdk路径为sdk\extras\android\support\v7\recyclerview,不过幸好用它不像用Toolbar那样麻烦,要想使用Toolbar得先导入并引用...onCreateViewHolder : 创建整个布局视图持有者。输入参数包括视图类型,可根据视图类型加载不同布局,从而实现带头部列表布局。...onBindViewHolder : 绑定每项视图持有者。 下面是可以重写也可以不重写方法: getItemViewType : 返回每项视图类型。...默认一项占一列,如果想某项占列,则可在此设置自定义占位规则,即由抽象类GridLayoutManager.SpanSizeLookup派生出具体实现类。

2.4K20

实战 | 认识 RecyclerView

在实现过程,我也会将 RecyclerView 每个部分揉碎了展现给大家,这样大家就可以在自己应用实现了。 RecyclerView 是 "何方神圣"?为什么选择它呢?...粉红色方格表示屏幕上正在显示表项,黄色方格表示屏幕可视范围之外表项是如何被回收并转为新视图 为什么您需要使用 RecyclerView 呢?...在 ViewHolder ,创建一个变量来引用 TextView,然后将它指向表项布局里对应视图。...重写 onCreateViewHolder() 当 ViewHolder 创建时候会调用该方法。在该方法里进行初始化和填充 RecyclerView 表项视图。...定义一个变量叫做 recyclerView,然后将 activity_main RecyclerView 赋值给 recyclerView

1.1K30

给 Adapter 做 “加法” —— 实战 MergeAdapter

我们先来看下面的 RecyclerView 应该如何实现? Merge Adapter 源码地址见文末。 实现起来其实很简单,利用现有的知识,大部分人都能想到用类型 itemView 。...MergeAdapter 构造函数参数顺序,就标识了列表数据显示顺序。 第一块布局是 Teacher 。在实际开发,常常可以用作 Header View 。...将一个 Adapter 负责套布局,拆分为每个 Adapter 只处理一个布局,大大降低代码耦合,这是 单一职责原则 。 面对新需求,需要给 RecyclerView 增加一个新类型 View。...如上面的例子所示,MergeAdapter 数据展示顺序,是按照构造函数参数顺序依次排列,而且同类型数据总是集中展示。...如果能支持 LayoutManager 那就更好了。在类型 RecyclerView ,部分数据需要横向滑动展示,部分数据需要纵向滑动展示,这种情况已经比较常见了。

52720

RecyclerView | 在 RecyclerView 中使用 header 快人一步

本文是介绍 RecyclerView 入门基础 系列文章 第四篇。如果您已经对创建 RecyclerView 有了一定认识,请继续阅读本文。如果尚未熟悉,建议您首先阅读本系列 第一篇文章。...本文中示例会在 RecyclerView 添加 Header,列表中会显示不同类型花。Header 显示 "Flower Finder",并且显示列表数量。...如果您需要动态更新文本,添加一个变量代表需要更新内容 TextView。创建 bind() 函数来使用传入字符串更新 TextView。 <!...onCreateViewHolder() 负责填充视图并且返回 HeaderViewHolder getItemCount() 仅返回数值 1,因为仅有一个 Header 元素 onBindViewHolder...创建一个变量代表 HeaderAdapter(),并将其置于 RecyclerView Adapter 之上。

61530

RecyclerView 必知必会

基本概念 RecyclerViewAndroid 5.0提出新UI控件,位于support-v7包,可以通过在build.gradle添加compile 'com.android.support...首先看构造函数,构造函数获得系统属性android:listDivider,该属性是一个Drawable对象。...runPendingAnimations(): RecyclerView动画执行方式并不是立即执行,而是每帧执行一次,比如两帧之间添加了多个Item,则会将这些将要执行动画Pending住,保存在成员变量...为了防止在执行add动画时外面有新add动画添加到mPendingAdditions,从而导致执行add动画错乱,这里将mPendingAdditions内容移动到局部变量additions,然后遍历...ViewHoldertext对象支持触摸拖拽,则在AdapteronBindViewHolder()添加: ?

2.5K70

Android开发笔记(一百七十二)第二代翻页视图ViewPager2

正如RecyclerView横空出世取代ListView和GridView那样,Android也推出了二代翻页视图ViewPager2,打算替换原来翻页视图ViewPager。...notifyItem***方法,从而动态刷新某项视图; 3、除了当前页,也支持展示左右两页部分区域; 4、支持在翻页过程展示自定义切换动画; 虽然ViewPager2增加了这么棒功能,但它用起来非常简单...GoodsInfo> goodsList) {         mContext = context;         mGoodsList = goodsList;     }     // 创建列表项视图持有者..., false);         return new ItemHolder(v);     }     // 绑定列表项视图持有者     public void onBindViewHolder...先在测试页面的Java代码补充下面几行:     // ViewPager2支持展示左右两页部分区域     RecyclerView cv_content = (RecyclerView) vp2

2.1K30

RecyclerView优化实战指南

Android 开发RecyclerView 是一个非常常用组件,用于展示大量数据。然而,如果不进行优化,RecyclerView 可能会导致 UI 卡顿、内存泄漏等问题。...它可以自动回收不可见视图,并且可以使用不同布局管理器来实现不同布局。RecyclerView 还提供了一些回调函数,允许你在视图复用时进行一些自定义操作。...使用 ViewHolder ViewHolder 是一种模式,用于缓存 RecyclerView 视图,减少内存开销,提高性能。...我们可以在 adapter_layout.xml 中使用 标签,将数据绑定到视图布局文件,从而减少代码量。...设置 Recyclerview 固定大小 在 Recyclerview 布局,设置 android:layout_height 和 android:layout_width 值为具体数值,可以避免列表项宽高随着内容变化而变化

42920

浅谈RecyclerView性能优化

众所周知,RecyclerView拥有四级缓存,它们分别是: Scrap缓存:包括mAttachedScrap和mChangedScrap,又称屏内缓存,不参与滑动时回收复用,只是用作临时保存变量。...CacheView缓存:mCachedViews又称离屏缓存,用于保存最新被移除(remove)ViewHolder,已经和RecyclerView分离视图,这一级缓存是有容量限制,默认最大数量为...提高ViewHolder复用 1.使用Scrap进行局部更新。...因为直接在onBindViewHolder方法创建匿名内部类方式来实现setOnItemClick,会导致在RecyclerView快速滑动时创建很多对象。...应当把事件绑定在ViewHolder创建时候和对应rootView进行绑定。 2.数据处理与视图绑定分离,去除onBindViewHolder方法里面的耗时操作,只做纯粹数据绑定操作。

1.7K10

RecyclerView 必知必会

基本概念 RecyclerViewAndroid 5.0提出新UI控件,位于support-v7包,可以通过在build.gradle添加compile 'com.android.support...可以看出,RecyclerView将ListViewgetView()功能拆分成了onCreateViewHolder()和onBindViewHolder()。...首先看构造函数,构造函数获得系统属性android:listDivider,该属性是一个Drawable对象。 因此如果要设置,则需要在value/styles.xml设置: ?...runPendingAnimations(): RecyclerView动画执行方式并不是立即执行,而是每帧执行一次,比如两帧之间添加了多个Item,则会将这些将要执行动画Pending住,保存在成员变量...如果要对ViewHoldertext对象支持触摸拖拽,则在AdapteronBindViewHolder()添加: ?

4.1K90

Android RecyclerView从入门到玩坏

前言 RecyclerViewAndroid界面开发当中是很重要, 那掌握它也是很必要....这篇文章融合了自己原来篇文章, 并进行了修正和改进, 而且添加了很多很有趣内容. 本文需要20分钟以上阅读时间, 请合理安排. 图预警, 转载请注明出处!...:cardview-v7:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' 之后在布局文件写入如下代码就引入了RecyclerView...增删动画 ---- 快速添加视图 还有像Header, Foot这样视图, 自己写也还是要费些功夫, 这里推荐Android大神库baseAdapter 引入: implementation...快速添加条目 是不是感觉省了一万个小时呢. ---- 让RecyclerView支持复杂视图 每次加入新视图都要对适配器进行比较大程度改动, 这样是很容易出错.

2K30

Android RecyclerView使用简述

,继承自RecyclerView.ViewHolder,重写里面的ViewHolder构造方法,获取一个Item视图View,创建完成之后就是绑定视图,执行onBindViewHolder,绑定时就会渲染视图...六、RecyclerView布局使用   在前面的使用我们在操作写适配器代码时,都是一个item布局,而有时候数据不同需要显示布局也不同,就存在布局情况,这种情况应该怎么处理呢?...因为在前面创建ViewHolder时用了不同内部类,那么在数据渲染时候也可以通过这个来判断,当前渲染是哪一个ViewHolder视图,关键代码如下所示: @Override public...我增加了一个show变量,用来控制适配器Item选中框是否显示,提供了show变量get和set方法,在set方法赋值之后调用notifyDataSetChanged()方法对适配器进行刷新,这个方法会触发...onBindViewHolder(),在这个方法可以看到根据show状态显示还是隐藏选中框。

2.3K21

RecyclerView实现混合布局

表示当前是第几个Item,然后我们可以通过position拿到当前Item对象,然后判断这个item对象需要那种视图,返回一个int类型视图标志,然后在onCreatViewHolder方法给引入布局...RecyclerView.Adapter   a:getItemViewType返回type值   b:onCreateViewHolder加载不同视图...  c:onBindViewHolder绑定数据 5:主文件设置recyclerview布局样式,赋值调试  1:Item  xml布局文件和Bean类,ViewHolder创建。...type,然后根据type去调用不同layout,然后在绑定数据方法再次判断是不是自己想要ViewHolder,最后赋值显示。...,就差展示了,所以重写onBindViewHolder方法 /** * 方法作用:绑定数据, * 方法描述:根据holder对控件进行赋值,同时如果有回调接口,在该方法写。

2.1K20

Android实战RecyclerView头部尾部添加方法示例

最近开启SDK Manager,突然发现android7.0都有了,这迭代升级还真快。不过国内普遍手机还是停留在4.4+,多则是是处于5.0版本。...上面代码看起来挺眼熟吧~ 二、对比RecyclerView,google进行优化 在RecyclerView依赖适配器,无论是适配器还是ViewHolder,从源码我们可以看出,都存在RecyclerView...(已经实现了复用,相对于ListviewBaseAdaptergetView方法需要开发者自己引入复用问题方便很多)等等。...(ViewHolder holder, int position) 在以前BaseAdapter,所有视图加载、数据绑定以及复用,都需要我们直接在getView里面进行操作。...onCreateViewHolder负责视图加载并且内部完成复用,onBindViewHolder负责数据绑定并且内部完成一系列缓存机制。这里满足了视图层与逻辑层分离,典型mvp模式。

66830
领券