为kotlin中的classrecyclerView项折叠设置onclick-in视图持有者

为kotlin中的classrecyclerView项折叠设置onclick-in视图持有者,kotlin,android-recyclerview,adapter,onclicklistener,android-viewholder,Kotlin,Android Recyclerview,Adapter,Onclicklistener,Android Viewholder,我正在尝试在我的recyclerView中设置一个简单的折叠项。 我在Java中看到了许多应用程序,但在Kotlin中只有少数。 onBindViewHolder中几乎设置了onClick方法,如下所示: val isExpandable:Boolean = data[position].expandable holder.subItem.visibility = if(isExpandable) View.VISIBLE else View.GONE holder.m

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

    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)
    }
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()
}
with(my_recycler) {

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

            adapter = MyAdapter(it) {
              //data can be accessed here according item position
            }
   }
这项工作做得很好。但是,我读到一些开发人员说,在onBindViewHolder中应用onClick方法不是一个好主意,必须在ViewHolder类中进行。 在使用Kotlin时,我以Koltin的方式应用了onClick方法,使用lambda。像这样:

    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)
    }
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()
}
with(my_recycler) {

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

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

如果要从适配器访问ViewHolder中的属性,可以将ViewHolder声明为内部类

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

        view.setOnClickListener {listener(data)}

    }
}
我还没有尝试调用notifyItemChanged(position),但是我想说的是,如果它将位于单击侦听器中,它应该不会崩溃。如果您从侦听器外部和调用notifyItemChanged的函数内部调用它,则可能会发生崩溃

让我知道它是否有效