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


    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    创建适配器类:接下来,你需要创建一个继承自 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
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    创建布局文件:根据需求,创建一个用于显示单个列表项的布局文件(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 // 不显示动画
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    Thank you for your reading, best regards!

  • 相关阅读:
    人脸识别之light_cnn
    8.2学习记录
    【Java】云HIS云端数字医院信息平台源码
    Bean拷贝工具类推荐
    php __destruct反序列化原理
    计算机系统(16)----- 调度算法(2)
    网络安全(黑客)自学
    elementUI table某列数据是数组,需要多行显示
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[15]以太坊-交易树和收据树
    小程序配置服务器域名
  • 原文地址:https://blog.csdn.net/qq_42751010/article/details/134293446