如何使用 Kotlin 在 RecyclerView 中显示所选项目的项目信息

Posted

技术标签:

【中文标题】如何使用 Kotlin 在 RecyclerView 中显示所选项目的项目信息【英文标题】:How to display item info on selected item in RecyclerView using Kotlin 【发布时间】:2022-01-13 08:16:07 【问题描述】:

如何在不使用 onClick 方法的情况下显示来自 recyclerview 选定项目的一些信息。当应用程序启动时,第一个项目被选中并突出显示。我需要例如。将 Toast 与数据类中的任何值一起使用。我已经实现了 onClick 方法,但问题是如何在不使用此方法的情况下做到这一点。

这是 MainActivity:

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val exampleList = generateDummyList(20)
        val exampleAdapter = ExampleAdapter(getItem, exampleList)

        exampleAdapter.onItemClick =  item, position: Int ->
            Toast.makeText(this, "Position: $position", Toast.LENGTH_SHORT).show() 
            val intent = Intent(this, ItemActivity::class.java).apply 
                putExtra("itempos", position)
                putExtra("maxSize", maxS)
            
            startActivity(intent)
        
    

这是适配器:

class ExampleAdapter(val chosen_item: Int, private val exampleList: List<ExampleItem>):
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>()

    var onItemClick: ((ExampleItem, Int) -> Unit)? = null    
    var selected_item: Int = chosen_item
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder 
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_recy, parent, false)
        return ExampleViewHolder(itemView)
    

    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int)
        val currentItem = exampleList[position]
        holder.tv_ID.text = currentItem.id.toString()
        holder.tv_NAME.text = currentItem.name
        holder.tv_EMAIL.text = currentItem.email
        if (position == selected_item)
            holder.tv_NAME.setBackgroundColor(Color.GREEN)            
         else 
            holder.tv_NAME.setBackgroundColor(Color.TRANSPARENT)            
         

override fun getItemCount(): Int 
        return exampleList.size
    
    inner class ExampleViewHolder(itemView:View): RecyclerView.ViewHolder(itemView) 
        val tv_ID: TextView = itemView.tv_ID
        val tv_NAME: TextView = itemView.tv_NAME
        val tv_EMAIL: TextView = itemView.tv_EMAIL
    init 
            itemView.setOnClickListener
                onItemClick?.invoke(exampleList[absoluteAdapterPosition], absoluteAdapterPosition)
                notifyItemChanged(selected_item)
                selected_item = absoluteAdapterPosition
                notifyItemChanged(selected_item)                
                        
            itemView.isSelected
        
    

我有第二个活动-当用户单击第一个活动(recyclerview)中的项目时-第二个活动是打开的-然后我将项目的ID提高一个并再次打开第一个活动,其中另一个项目被突出显示。我需要显示例如。来自 ExampleItem 类的 EMAIL。

这是第二个活动:

class ItemActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_item)
        var itempos = intent.getIntExtra("itempos",0)
        val maxSize = intent.getIntExtra("maxSize",0)
        button2.setOnClickListener 
            if (itempos == maxSize)
                itempos = itempos
             else 
                itempos = itempos + 1
            
            val intent = Intent(this, MainActivity::class.java).apply 
                putExtra("itemposplus", itempos)
            
            startActivity(intent)
        
    

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望随时(无需单击)获取所选项目。有几种方法可以做到这一点。我建议你在 ViewHolder 中使用 getAdapterPosition() 方法

首先,保存您的 ViewHolder

class ExampleAdapter(val chosen_item: Int, private val exampleList: List<ExampleItem>):
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>()

    var onItemClick: ((ExampleItem, Int) -> Unit)? = null    
    var selected_item: Int = chosen_item
    lateinit var viewHolder: ExampleViewHolder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder 
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_recy, parent, false)
        viewHolder = ExampleViewHolder(itemView)
        return viewHolder
    

然后在适配器中写入一个公共方法来获取activity中的当前项

fun getCurrentItem(): ExampleItem = exampleList.get(viewHolder.getAdapterPosition())

终于可以在activity中获取选中的item了

val selectedItem = exampleAdapter.getCurrentItem()

您也可以在 RecyclerView 中检查 getLayoutManager().findFirstVisibleItemPosition() 方法

【讨论】:

getAdapterPosition 已弃用 - 我正在使用 absoluteAdapterPosition。但是当我运行应用程序时,出现错误lateinit property viewHolder has not been initialized。 好的,然后尝试将您的代码从 onCreate 移动到 onStart 或 onResume。

以上是关于如何使用 Kotlin 在 RecyclerView 中显示所选项目的项目信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kotlin 中使用片段

如何在 Kotlin 中使用 ViewModelProviders

如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟

如何在Kotlin中使用Gradle构建缓存?

如何在 Kotlin/Multiplatform 项目中使用 .klib 库

如何使用 Kotlin 在所有活动中播放背景音乐?