微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ViewHolder中将onclick设置为classrecycler

如何解决在ViewHolder中将onclick设置为classrecycler

我正在尝试在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)
    }

这个工作很好。但是,我读到一些开发人员说,在onBindViewHolder内部应用onClick方法不是一个好主意,必须在ViewHolder类内部完成。 当我使用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方法,在“活动”中,当我设置适配器时,可以像这样访问数据:

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),但是我想说,如果它要放在Click侦听器中,它应该不会崩溃。如果从侦听器外部以及在notifyItemChanged上调用的函数内部调用它,则可能会崩溃。

让我知道它是否有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。