如何在Activity中的RecyclerView适配器声明中声明Click侦听器

问题描述

我正在尝试将我的Activity(包含RecyclerView)与RecyclerView适配器连接,但是卡在声明部分。我知道需要指定与适配器类中的click listener参数关联的值,但是我不确定每个RecyclerView项具有不同值时应该是什么。

mAdapter = MyAdapter(this,mList,true,?)

关于应将问题标记为什么的任何想法?

活动

class MainActivity : AppCompatActivity() {
    private lateinit var mAdapter: MyAdapter
    private val mList = ArrayList<MyItem>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mList.add(
                ItemCompany(
                        getString(R.string.bing)
                )
        )
        mList.add(
                ItemCompany(
                        getString(R.string.google)
                )
        )
        mList.add(
                ItemCompany(
                        getString(R.string.yahoo)
                )
        )

        val mRecyclerView = findViewById<RecyclerView>(R.id.myRecyclerView)
        mRecyclerView.layoutManager =
                        androidx.recyclerview.widget.linearlayoutmanager(this)
        mAdapter = MyAdapter(this,?)
        mRecyclerView.addItemdecoration(
                        androidx.recyclerview.widget.DividerItemdecoration(
                                this,LinearLayout.VERTICAL
                        )
                )
        mRecyclerView.adapter = mAdapter
    }
}

RecyclerView适配器

class MyAdapter(
        val myContext: Context,var listCompany: MutableList<ItemCompany>,private val mTwoPane: Boolean,private val itemClickListener: AdapterView.OnItemClickListener
) : androidx.recyclerview.widget.RecyclerView.Adapter<MyAdapter
.CompanyViewHolder>() {

    class CompanyViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView) {
        var tvTitle: TextView = itemView.findViewById(R.id.tv_RVItem)

        fun bind(company: ItemCompany,clickListener: AdapterView.OnItemClickListener)
        {
            tvTitle.text = company.companyName

            itemView.setonClickListener {v ->
                val intent: Intent = when (company.companyName) {
                    v.resources.getString(R.string.bing) -> {
                        Intent(Intent.ACTION_VIEW,Uri.parse("https://www.bing.com/"))
                    }
                    v.resources.getString(R.string.google) -> {
                        Intent(Intent.ACTION_VIEW,Uri.parse("https://www.google.com/"))
                    }
                    else -> {
                        Intent(Intent.ACTION_VIEW,Uri.parse("https://www.yahoo.com/"))
                    }
                }
                itemView.getContext.startActivity(intent)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): CompanyViewHolder {
        val inflater = LayoutInflater.from(myContext)
        val v = inflater.inflate(R.layout.rv_item,parent,false)
        return CompanyViewHolder(v)
    }

    override fun onBindViewHolder(holder: CompanyViewHolder,position: Int) {
        val product = listCompany[holder.adapterPosition]

        holder.tvTitle.text = product.companyName

        holder.bind(product,itemClickListener)
    }

    override fun getItemCount(): Int {
        return listCompany.size
    }

    override fun getFilter(): Filter {
        return companyFilter
    }
}

解决方法

您可以使用lamda声明您的点击侦听器:

val mListener = AdapterView.OnItemClickListener { parent,view,position,id -> }
val mAdapter = MyAdapter(this,mList,true,mListener)

或者简单地:

val mAdapter = MyAdapter(this,true) { parent,id -> }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...