在 ViewHolder 中设置 onclick for classrecyclerView item collapse in kotlin

Set onclick in ViewHolder for classrecyclerView item collapse in kotlin

我正在尝试在我的 recyclerView 中设置一个简单的折叠项目。 我在 Java 中看到了很多应用程序,但在 Kotlin 中只有少数。 onClick 方法几乎是在 onBindViewHolder 内部设置的,如下所示:

    val isExpandable:Boolean = data[position].expandable
    holder.subItem.visibility = if(isExpandable) View.VISIBLE else View.GONE

    holder.mainItem.setOnClickListener {
        data[position].expandable = !data[position].expandable
        notifyItemChanged(position)
    }

这项工作非常好。但是,我读到一些开发人员说在 onBindViewHolder 中应用 onClick 方法不是一个好主意,它必须在 ViewHolder class 中完成。 当我使用 Kotlin 时,我使用 lambda 以 Koltin 的方式应用了 onClick 方法。像这样:

class MyAdapter(val data:List<MyModel>,
                val listener:(MyModel)->Unit):RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
        fun bind (data:MyModel,listener: (MyModel) -> Unit) = with(itemView){
           ...

            view.setOnClickListener {listener(data)}

        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder = MyViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.card_item,parent,false)
    )

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(data[position], listener)
    }


    override fun getItemCount(): Int = data.count()
}

如何在 onClick 中使用 data[position]notifyItemChanged(position)

注意:使用这个Kotlin方法,在Activity中,当我设置Adapter时,可以这样访问数据:

with(my_recycler) {

            layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)

            adapter = MyAdapter(it) {
              //data can be accessed here according item position
            }
   }

如果您想从适配器访问 ViewHolder 中的属性,您可以将 ViewHolder 声明为内部 class。

inner class MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
      fun bind (data:MyModel,listener: (MyModel) -> Unit) = with(itemView){
       ...

        view.setOnClickListener {listener(data)}

    }
}

我还没有尝试调用 notifyItemChanged(position),但我会说如果它在点击侦听器中,它不应该崩溃。如果您从侦听器外部和在 notifyItemChanged 上调用的函数内部调用它,那么您可能会崩溃。

如果有效请告诉我。