如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器

Posted

技术标签:

【中文标题】如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器【英文标题】:How to declare click listener within RecyclerView adapter declaration inside Activity 【发布时间】:2021-02-02 18:20:58 【问题描述】:

我正在尝试将我的 Activity(包含 RecyclerView)与 RecyclerView 适配器连接,但在声明部分卡住了。我知道需要指定与我的适配器类中的单击侦听器参数关联的值,但我不确定当每个 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, mList, true, ?)
        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
    

【问题讨论】:

【参考方案1】:

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

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

或者简单地说:

val mAdapter = MyAdapter(this, mList, true)  parent, view, position, id -> 

【讨论】:

以上是关于如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Android-启动模式task-lunchmodle-intent flag 总结

关于Activity

当 Wi-Fi Direct 范围内的对等点不再可用时,如何通知?

Activity安卓2

android activity 各种布局方式以及相关参数

Activity的启动流程