安卓常见设计模式7------适配器模式(Kotlin版)(RecycleView adapter 模板代码)

news/2024/7/8 2:51:51 标签: android, 设计模式, 适配器模式

1. W1 是什么,什么是适配器模式?​

  1. 适配器模式(Adapter Pattern)是一种常见的设计模式,它用于将一个类的接口转换成另一个客户端所期望的接口。
  2. 在 Android 中,适配器模式通常用于将数据与视图进行绑定,以便在列表、网格等视图组件中显示数据。

2. W2 为什么,为什么需要使用适配器模式,能给我们编码带来什么好处?​

  1. 兼容性:适配器模式可以帮助我们解决不兼容的接口问题。当我们需要使用一个已有的类或接口,但其接口与我们当前需要的接口不匹配时,适配器模式可以充当一个中间层,将两者进行适配,使它们能够协同工作。

  2. 重用性:适配器模式可以增强代码的重用性。通过适配器,我们可以重复使用已有的类或接口,并将其应用于不同的场景中。适配器模式使得我们无需修改已有的类或接口,只需通过适配器进行适配,从而减少了代码的修改和重复编写。

  3. 解耦性:适配器模式可以降低代码之间的耦合度。通过适配器模式,客户端代码与具体的被适配类或接口解耦,客户端只需要面向适配器编程,而不需要关心具体的实现细节。这样可以提高代码的可维护性和可扩展性。

  4. 扩展性:适配器模式可以方便地扩展系统功能。当需要添加新的类或接口时,可以通过创建新的适配器来适配新的类或接口,而无需修改已有的代码。这样可以在不影响现有功能的情况下,快速地扩展系统的功能。

  5. 统一接口:适配器模式可以统一不同类或接口的使用方式。通过适配器模式,我们可以将多个不同的类或接口适配成一个统一的接口,使得客户端可以一致地使用它们,而不需要关心它们的具体实现。

4. W3,如何使用?下面是代码示例:​

// 创建数据模型类:首先,需要创建一个数据模型类,该类用于表示列表中的每个项的数据。例如,如果要显示一组用户数据,可以创建一个名为User的数据模型类,其中包含用户的姓名、年龄等信息。

data class User(val name: String, val age: Int, val type: Int = XXXType.TypeA)

object XXXType {
    const val TypeA = 1
    const val TypeB = 2
    const val TypeC = 3
}

创建适配器类:接下来,你需要创建一个继承自 RecyclerView.Adapter 或 ListView.Adapter 的适配器类。适配器类负责将数据绑定到视图上,并在需要时创建或复用视图。你需要重写适配器的方法,例如 onCreateViewHolder、onBindViewHolder 和 getItemCount。

class XXXAdapter(
    private val mContext: Context,
    private val userList: List<User>
) : RecyclerView.Adapter<XXXAdapter.VH>() {

    abstract class VH(itemView: View) : RecyclerView.ViewHolder(itemView)

    class UserAVH(val viewBinding: ItemUserABinding) : VH(viewBinding.root)

    class UserBVH(val viewBinding: ItemUserBBinding) : VH(viewBinding.root)

    class UserCVH(val viewBinding: ItemUserCBinding) : VH(viewBinding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
        return when (viewType) {
            XXXType.TypeA -> UserAVH(
                ItemUserABinding.inflate(
                    LayoutInflater.from(
                        mContext
                    ), parent, false
                )
            )

            XXXType.TypeB -> UserBVH(
                ItemUserBBinding.inflate(
                    LayoutInflater.from(
                        mContext
                    ), parent, false
                )
            )

            else -> UserCVH(
                ItemUserCBinding.inflate(
                    LayoutInflater.from(
                        mContext
                    ), parent, false
                )
            )
        }
    }

    override fun getItemCount(): Int {
        return userList.size
    }
    
    override fun onBindViewHolder(holder: VH, position: Int) {
        val menuData = userList[position]
        when (holder) {
            is UserAVH -> {

            }

            is UserBVH -> {

            }
            
			is UserCVH -> {
			
			}
        }
    }

    override fun getItemViewType(position: Int): Int {
        return userList[position].type
    }
}

创建布局文件:根据需求,创建一个用于显示单个列表项的布局文件(item_user_a.xml, item_user_b.xml, item_user_c.xml)。布局应包含用于显示数据的视图元素,例如 TextView、ImageView 等。

设置适配器:最后一步是在我们的 Activity 或 Fragment 中设置适配器,将其与 RecyclerView 或 ListView 组件关联起来,并提供数据源。

val gridManager = GridLayoutManager(this, 3).apply {
    spanSizeLookup = object : SpanSizeLookup() {
        override fun getSpanSize(position: Int): Int {
            return when (userList[position].type) {
                XXXType.TypeA -> 1
                else -> 3
            }
        }
    }
}

recyclerView.layoutManager = gridManager
recyclerView.adapter = XXXAdapter(this, userList)
recyclerView.itemAnimator = null // 不显示动画

通过以上步骤,就可以使用适配器模式将数据与 RecyclerView 或 ListView 组件进行绑定,以便在列表中显示数据。适配器模式的好处是,它使得我们可以使用不同类型的数据源,并将它们以统一的方式显示在列表中,同时也提供了视图的复用机制,以提高性能和内存效率。

Thank you for your reading, best regards!


http://www.niftyadmin.cn/n/5164634.html

相关文章

【ArcGIS Pro二次开发】(75):ArcGIS Pro SDK二次开发中的常见问题及解决方法

ArcGIS Pro SDK二次开发路程也近一年时间了&#xff0c;这里总结一下平时遇到的一些问题和解决方法。有些问题没能解决&#xff0c;也记录下来&#xff0c;提醒自己不要忘记。 一、在VS2022中进行调试弹出错误 正常在VS2022中&#xff0c;如果要调试程序的话&#xff0c;直接按…

DHCP概述及原理

• Dynamic Host Configuration Protocol – 动态主机配置协议,由 IETF(Internet 网络工程师任 务小组)组织制定, 用来简化主机地址分配管理 • 主要分配以下入网参数 – IP地址/子网掩码/广播地址 – 默认网关地址、DNS服务器地址 DHCP概述及原理&#xff08;广播进行&a…

grpc使用教程

准备 1&#xff0c;安装grpc go get -u google.golang.org/grpc2, 安装go语言protobuf生成器protoc-gen-go go get -u google.golang.org/protobuf/cmd/protoc-gen-go注意&#xff1a; 将GOPATH下的bin目录配置在环境变量中否则会找不到命令编写proto文件 # server/proto/tes…

Globalsign证书

GlobalSign是全球可信的数字证书提供商之一&#xff0c;提供广泛的证书服务&#xff0c;包括SSL证书、代码签名证书、电子邮件证书等&#xff0c;帮助保护企业和个人的网络安全。本文将详细介绍GlobalSign证书的特点和优势&#xff0c;帮助您更好地了解这一重要的数字证书提供商…

重装系统后,如何恢复丢失的桌面文件

在我们使用电脑的过程中&#xff0c;有时不得不重装操作系统&#xff0c;以解决各种问题和提升电脑性能。然而&#xff0c;重装系统后会遇到一个常见的问题&#xff0c;那就是丢失了桌面上的文件和文件夹。这些文件可能是用户的个人数据、重要的工作文档或珍贵的照片&#xff0…

swift和OC混编报错问题

1.‘objc’ instance method in extension of subclass of ‘xxx’ requires iOS 13.0.0 需要把实现从扩展移到主类实现。iOS13一下扩展不支持objc 2.using bridging headers with framework targets is unsupported 报错 这个错误通常指的是在一个框架目标中使用桥接头是不…

经典猜数游戏(python类封装)

五次机会猜测100以内随机正整数&#xff0c;我用初通的python类封装了代码并清屏上一次猜测提示&#xff0c;难有所增加咯。 (笔记模板由python脚本于2023年11月09日 12:31:30创建&#xff0c;本篇笔记适合掌握python循环和条件分支语句用法&#xff0c;初通python类的coder翻阅…

网站PC和APP发布收费标准

网站PC和APP发布的收费标准因开发方式、功能和设计等因素而异。一般来说&#xff0c;网站PC端的收费标准主要包括域名注册费、服务器租赁费、网站设计和开发费用等。其中&#xff0c;域名注册费通常在100元至数百元不等&#xff0c;服务器租赁费每年在数百元至数千元不等&#…