【问题标题】:Can any one tell me how to work with recyclerview on click listener in kotlin谁能告诉我如何在 kotlin 的点击监听器上使用 recyclerview
【发布时间】:2020-03-16 21:44:41
【问题描述】:

这是显示行的活动的代码

class doctors : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_doctors)

    val recyclerView = findViewById<RecyclerView>(R.id.docrecview)


    recyclerView.layoutManager = LinearLayoutManager(this)


    val docs = ArrayList<DocData>()





    val btn_click_me = findViewById<Button>(R.id.consult_btn)

    btn_click_me.setOnClickListener {
        Toast.makeText(this, "You clicked me.", Toast.LENGTH_SHORT).show()
    }


    val TAG = "My message"
    val db = FirebaseFirestore.getInstance()
//calling data from firebase to populate rows
    db.collection("doctors")
        .get()
        .addOnSuccessListener { result ->
            for (document in result) {
                Log.d(TAG, "${document.id} => ${document.data}")
                docs.add(DocData(document.data["name"].toString(), document.data["specialization"].toString()))

            }
            recyclerView.adapter = Adapter(docs)


        }
        .addOnFailureListener { exception ->
            Log.d(TAG, "Error getting documents: ", exception)
        }




}

这是适配器

class Adapter (val doctorlist: ArrayList<DocData>) : RecyclerView.Adapter<Adapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
    val v = LayoutInflater.from(parent?.context).inflate(R.layout.user_row, parent, false)
    return ViewHolder(v)


}

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

override fun onBindViewHolder(holder: Adapter.ViewHolder, position: Int) {
    val doc:DocData = doctorlist[position]

    holder.txtname.text =  doc.name
    holder.txtSpec.text = doc.specialization

}

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

    val txtname = itemView.findViewById<TextView>(R.id.textName)
    val txtSpec = itemView.findViewById<TextView>(R.id.major)
    val btn = itemView.findViewById<Button>(R.id.consult_btn)

}

}

红色标记区域是recyclerview中的一个按钮,我想通过单击该按钮进入另一个活动,但我无法弄清楚这是我的学习阶段,如果你们能提供帮助,我将不胜感激 提前谢谢你

【问题讨论】:

    标签: kotlin android-recyclerview onclicklistener


    【解决方案1】:

    https://stackoverflow.com/a/58836873/2914140。您需要创建一个接口,如:

    public interface ClickListener {
        void onClick(int position);
    }
    

    你可以在那里放置任何参数,不仅是position。在活动/片段中实现接口。然后从onBindViewHolder()调用它:

    @Override
    public void onBindViewHolder(holder: Adapter.ViewHolder, position: Int) {
         holder.textView1.setOnClickListener{
             clickListener.onClick(position));
         }
    }
    

    您还需要使用适配器的方法或构造函数设置clickListener

    【讨论】:

    • 然后呢?这很容易,在这个例子中略有不同。我也用 Kotlin 编写(不是在这种情况下)。
    【解决方案2】:

    你有两个选择。要么使用接口,要么使用higher order function,我更喜欢后者。使用函数传递一个 onClick 函数,当您单击 btn 时调用该函数:

    class Adapter(
        private val docList: List<DocData>,
        private val onClick: (DocData) -> Unit // a function that takes a DocData parameter
    ) : RecyclerView.Adapter<Adapter.ViewHolder>() {
        // ......
    
        override fun onBindViewHolder(holder: Adapter.ViewHolder, position: Int) {
            val doc: DocData = doctorlist[position]
            btn.setOnClickListener {
                onClick.invoke(doc)
            }
            //.....
        }
    
    }
    

    然后在实例化Adapter时传递一个函数:

    Adapter(docs) { docData ->
        // btn was clicked in this docData
    }
    

    【讨论】:

    • 嗨 Mohamed,为什么我们需要通过适配器传递函数,而不是仅仅在 onBindViewHolder 中定义它
    • 你不能改变onBindVeiwHolder()的签名,你不应该给自己打电话。 Adapter 对象的所有者需要使用构造函数(如上)或另一个 setter 函数传递 onClick 函数。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多