【问题标题】:adding onclicklistener to recycler view with viewbinding, kotlin使用 viewbinding, kotlin 将 onclicklistener 添加到回收器视图
【发布时间】:2023-01-10 03:11:47
【问题描述】:

尝试将 onclicklistener 添加到我的回收站视图中的项目,这将使用意图打开另一个活动。我试过查找示例,但我只能找到使用未使用视图绑定的 Java 或 Kotlin 示例的示例。

package com.truuce.anotherrvtest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager

import com.truuce.anotherrvtest.databinding.ActivityHeroBinding

class HeroActivity : AppCompatActivity() {

    var binding: ActivityHeroBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityHeroBinding.inflate(layoutInflater)
        setContentView(binding?.root)

        val adapter = CardAdapter(HeroList.heroList)
        binding?.heroRV?.adapter = adapter
        binding?.heroRV?.layoutManager = GridLayoutManager(applicationContext, 3)

    }

    override fun onDestroy() {
        super.onDestroy()
        binding = null
    }
}
package com.truuce.anotherrvtest

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.truuce.anotherrvtest.databinding.HeroCardBinding

class CardAdapter(val heroList: List<Hero>) : RecyclerView.Adapter<CardAdapter.MainViewHolder>() {

    inner class MainViewHolder(val heroBinding: HeroCardBinding) :
        RecyclerView.ViewHolder(heroBinding.root) { 
        fun bindHero(hero: Hero){
            heroBinding.heroNameTV.text = hero.heroName
            heroBinding.heroIV.setImageResource(hero.image)
        }

    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {


        return MainViewHolder(HeroCardBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }


    override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
        val hero = heroList[position]
        holder.bindHero(hero)
    }


    override fun getItemCount() = heroList.size
}

尝试将 View.OnClickListener 添加到 MainViewHolder,然后实现一个成员。 OnClick(p0: View){},但不知道如何让它工作。

【问题讨论】:

    标签: kotlin android-intent android-recyclerview onclicklistener android-viewbinding


    【解决方案1】:

    您应该在适配器中为点击监听器添加一个功能属性。

    Activity 可以设置项目点击侦听器行为。

    class CardAdapter(val heroList: List<Hero>) : RecyclerView.Adapter<CardAdapter.MainViewHolder>() {
    
        var itemClickListener: (Hero)->Unit = {}
    
        inner class MainViewHolder(val heroBinding: HeroCardBinding) :
            RecyclerView.ViewHolder(heroBinding.root) { 
            fun bindHero(hero: Hero) = with(heroBinding) {
                heroNameTV.text = hero.heroName
                heroIV.setImageResource(hero.image)
                root.setOnClickListener { itemClickListener?.invoke(hero) }
            }
    
        }
    
        //...
    }
    
    // In Activity:
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityHeroBinding.inflate(layoutInflater)
            setContentView(binding?.root)
    
            val adapter = CardAdapter(HeroList.heroList)
            binding?.heroRV?.adapter = adapter
            binding?.heroRV?.layoutManager = GridLayoutManager(applicationContext, 3)
    
            adapter.itemClickListener = { hero ->
                // do something with hero item when it's clicked
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多