当前位置: 首页 > 知识库问答 >
问题:

在kotlin中,如何为recyclerview适配器设置单击事件

桓兴腾
2023-03-14

我是kotlin android的新手。我已经创建了回收站视图的适配器。但是我不能为每个回收站视图项目执行单击事件。我需要参考代码的解释。请帮我做这件事。提前谢谢。这是我的代码供您参考。

  class CustomAdapter(val readerList: ReaderResponse, mainActivity: 
    MainActivity,val btnlistener: BtnClickListener) : 
    RecyclerView.Adapter<CustomAdapter.ViewHolder>() {


    companion object {
        var mClickListener: BtnClickListener? = null
    }

    override fun onCreateViewHolder(viewgroup: ViewGroup, index: Int): ViewHolder 
    {

        val view=LayoutInflater.from(viewgroup?.context).inflate(R.layout.reader_list,viewgroup,false)
        return ViewHolder(view)
    }

    override fun getItemCount(): Int {
        return readerList.results.size

    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        mClickListener = btnlistener
        val item = readerList

        val reader:ReaderData = readerList.results[position]
        /*p0?.imageview?.text=reader.readerIcon*/
        holder?.reader_status?.text=reader.readerStatus
        holder?.ward_name?.text=reader.wardName
        holder?.reader_id?.text=reader.readerID
        holder?.reader_name?.text=reader.readerName
        holder?.reader_location?.text=reader.readerLocation


        if (reader.readerStatus.toLowerCase().equals("yes")){
            holder.reader_name.setTextColor(Color.parseColor("#24a314"))
        }else if (reader.readerStatus.toLowerCase().equals("no")){

            holder.reader_name.setTextColor(Color.parseColor("#f4312d"))
            holder.warning.setVisibility(View.VISIBLE)
        }
    }



    class ViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView) {

        val imageview = itemView.findViewById(R.id.imageview) as Button
        val reader_name = itemView.findViewById(R.id.reader_name) as TextView
        val reader_location = itemView.findViewById(R.id.floor_no) as TextView
        val ward_name = itemView.findViewById(R.id.ward_name) as TextView
        val reader_id = itemView.findViewById(R.id.reader_id) as TextView
        val reader_status = itemView.findViewById(R.id.reader_status) as TextView
        val warning=itemView.findViewById(R.id.warning) as Button




      }
      open interface BtnClickListener {
        fun onBtnClick(position: Int)
     }

     }

共有2个答案

安奇
2023-03-14

您只需要在初始化此适配器的相应活动中实现BtnClickListener。一旦实现了BtnClickListener,它将覆盖活动中的函数onBtnClick。在适配器中需要做的唯一一件事是在所需元素上初始化onClickListener,并在该方法中调用imageview。setOnClickListener{McClickListener?.onBtnClick(位置)}。它会把这个职位送回活动中,你可以在那里执行你的特定任务。例如,我在一个活动中实现了ClickListener,并在那里打印了日志,效果很好。下面是它的演示代码。

class Main2Activity : AppCompatActivity(), CustomAdapter.BtnClickListener {
    override fun onBtnClick(position: Int) {
        Log.d("Position", position.toString())
    }

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

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        val readerResponseList = ArrayList<YourModelClassName>()
        val adapter = CustomAdapter(readerResponseList,this,this)
        recyclerView.adapter = adapter
    }

希望有帮助。

郎鸿
2023-03-14

您可以使用以下方法。这是取自Antonio Leiva的博客

假设你的数据类是ReaderData

class CustomAdapter(val readers: List, val listener: (ReaderData) -> Unit) {

    /* Other methods */

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        /*...*/

        holder.imageview.setOnClickListener { 
            listener(readers[position]) 
        }
    }
}

现在在你的活动或片段中

recyclerview.adapter = CustomAdapter(readersList) { readerData ->
    Log.i(TAG, "${readerData.readerID} clicked")
}

这个想法是你传递一个lambda,当你想要的项目被点击时,它将被执行。

 类似资料:
  • 我有一个光标适配器显示的项目列表,当我使用时,我得到了正确的行并且能够做我需要的事情(我的目标是在单击时向该项目添加视图。现在我需要在单击单元格中的按钮时发生此操作。但是,按钮单击事件不会返回正确的单元格,而是随机返回列表中的其他单元格,这是我的代码中的一个示例: 在这个示例代码中,我想要单击单元格中的按钮,让我访问按钮真正所在的视图,但是我从随机列表单元格中获取视图,如何在我的单击侦听器中获取正

  • 我为后台服务实现了一个AsyncTask来执行对数据库的查询,该查询速度非常快,不超过2-3秒。AsyncTask中的ProgressDialog有时很难检测到。 我的问题是,当任务完成并且我检索到游标时,当我将适配器设置到RecyclerView时,流程会冻结我的UI几秒钟,直到数据设置完毕。当我执行搜索(新查询,与获取所有行相同的过程,但行数较少),并替换光标以更新数据时,也会发生这种情况。

  • 我是kotlin的新手,这是我的适配器代码,它可以查找,我没有问题,现在,我需要为它实现click listener,下面是我的代码: 我想添加click listener,我以前在viewholder类中实现click listener 我在科特林怎么做?我打了这么多的平手,但都没有成功

  • 我有两个片段:(1)图书馆片段,(2)书片段 图书馆碎片通过RecyclerView显示所有可用的书籍。用户可以在每个RecyclerView项目上设置标签,这将把LiveData设置为相应的图书。同时,书籍片段将被打开,并显示该书的内容。 我在ViewHolder类中设置了一个onClickListener,它位于图书馆片段的RecyclerView. Adapter中。因此,当单击一个项目时,

  • > 从创建的片段中更新,将新数据设置为adapter,然后调用;但没有奏效。 像其他人一样创建一个新适配器,它对他们起作用,但对我没有任何改变: 在中创建一个更新数据的方法,如下所示: 问题是gridView的布局如下所示: 然后我只是删除了并将作为父布局。

  • 试图弄清楚更新的适配器有什么问题。 在我得到一个新的产品列表后,我尝试: > 从创建的片段中更新,将新数据设置到adapter,然后调用;但没有奏效。 像其他人一样创建一个新适配器,它对他们有效,但对我没有任何改变: 在中创建一个更新数据的方法,如下所示: 然后每当我想要更新数据列表时,我就调用这个方法;但没有奏效。 检查是否可以以任何方式修改recyclerView,并且我尝试至少删除一个项目: