我们可以根据特定的 recyclerview 项目点击通过单个界面传递多种类型的对象(项目)吗

Posted

技术标签:

【中文标题】我们可以根据特定的 recyclerview 项目点击通过单个界面传递多种类型的对象(项目)吗【英文标题】:Can we pass multiple types of object(item) through single interface as per particular recyclerview item click 【发布时间】:2020-08-24 03:18:39 【问题描述】:
interface ItemClickListener 
fun transferData(data : **I want to add any type item as per recyclerview click**)

我有 2 种不同类型的对象要传输,例如 AddressUser

data class Address(
val city_name : String?,
val address_line_one : String?,
val address_line_two : String?,
val pin_code: String?)

data class User(
val name : String?,
val age: Int?,
val gender: String?)

我想实现这一点,如果我点击 User 列表项然后通过界面传递用户点击的项目,如果我点击 Address 列表然后通过界面传递地址点击的项目.

【问题讨论】:

使用 Any 并且当你实现接口时你可以检查它是地址还是用户 我想我需要添加更多的对象类,所以当对象类增加时使用 when 会变得更糟。我会尝试任何。 你可以使用sealed类,Address & User都会扩展到它,之后在接口实现中可以检查类型并适当处理 同意@mangkool 你应该从抽象类或密封类扩展的好方法 @mangkool 我不是很有经验,你可以分享任何示例代码 【参考方案1】:

根据评论,您可以使用密封类来实现这一点,代码将是这样的:

// the sealed class
sealed class Data 
    data class Address(
            val city_name : String?,
            val address_line_one : String?,
            val address_line_two : String?,
            val pin_code: String?) : Data()

    data class User(
            val name : String?,
            val age: Int?,
            val gender: String?): Data()


// interface
interface ItemClickListener 
    fun transferData(data : Data)


// implementation, this could be in your activity/fragment
class Try: ItemClickListener 
    override fun transferData(data: Data) 
        when(data) 
            is Data.Address -> 
                // handle when data is address
            

            is Data.User -> 
                // handle when data is User
            
        
    


【讨论】:

非常感谢您抽出宝贵时间与我分享您的知识。 @akshaykondekar 没问题,如果这对您有用,请不要忘记将其标记为已接受的答案 class AddressAdapter(val addresslist : ArrayList, val itemClickListener: ItemClickListener) : RecyclerView.Adapter() inner class AddressViewHolder(var view : View): RecyclerView。 ViewHolder(view) fun bind(address : Data.address, clickListener: ItemClickListener) ... update ui .... view.setOnClickListener clickListener.transferData(address) 当我设置 clickListener.transferData(address) 它显示需要:找到数据:Data.Address 您不需要专门使用地址只是数据。将您的地址列表更改为数据的arrayList。我认为您在这里的意图与您在问题中提出的意图不同

以上是关于我们可以根据特定的 recyclerview 项目点击通过单个界面传递多种类型的对象(项目)吗的主要内容,如果未能解决你的问题,请参考以下文章

如何更新/刷新 RecyclerView 中的特定项目

如何更新 RecyclerView 中某个项目的特定 TextView?

Recyclerview 根据单击的项目获取项目值

RecyclerView - 如何平滑滚动到嵌套滚动视图内某个位置的项目顶部?

如何让 Espresso 单击特定的 RecyclerView 项目?

在 RecyclerView 中的特定位置拖放停止