繁体   English   中英

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

[英]in kotlin how to set click event for recyclerview adapter

我是Kotlin android上的新手。 我已经为recyclerview创建了适配器。 但是我无法为每个recyclerview项目执行click事件。 我需要带有参考代码的解释。 请帮助我做到这一点。 提前致谢。 这是我的代码供您参考。

  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)
     }

     }

您可以使用以下方法。 这是从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,该lambda将在您单击所需项目时执行。

您只需要在初始化此适配器的相应活动中实现BtnClickListener。 一旦实现了BtnClickListener,它将覆盖活动中的onBtnClick函数。 在适配器中,您唯一需要做的就是在所需元素上初始化onClickListener ,在该方法中只需调用imageview.setOnClickListener {mClickListener?.onBtnClick(position)}即可 它会将职位发送回活动中,您可以在那里执行特定任务。 例如,我已经在一个Activity中实现了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
    }

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM