Kotlin从Recyclerview新的片段

我试图从当前片段的RecyclerView适配器打开一个新的片段。但我不知道如何设置onClickListener ..这是我的代码

internal class ContentAdapter constructor (private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener { override fun onClick(v: View?) { val manager = activity.supportFragmentManager // I cannot resolve activity here val transaction = manager.beginTransaction() val book = IndividualBook() transaction.add(android.R.id.content, book, "IndividualBook") transaction.addToBackStack(null) transaction.commit() } override fun getItemCount(): Int = dataList.size override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { return ViewHolder(LayoutInflater.from(parent!!.context).inflate(R.layout.item,parent,false)) } override fun onBindViewHolder(holder: ViewHolder?, position: Int) { holder!!.bind(dataList) holder.itemView.setOnClickListener(this) } class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) { fun bind(DataList: ArrayList<DataList>){ val dataList = DataList[adapterPosition] itemView.itemTitle.text = dataList.title Glide.with(itemView.context).load(dataList.image).into(itemView.itemImage) itemView.regPrice.text = dataList.regPrice itemView.regPrice.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG itemView.splPrice.text = dataList.splPrice } } } 

帮我解决这个问题。

一些解决方案:

  1. Kotlin默认所有的类都是static 。 你必须选择他们是inner类。 把这个类放入一个Activity中,然后把这个inner修饰符加入到这个类中:

     internal inner class ContentAdapter constructor (private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener { 
  2. 保持ContentAdapter为static ,但通过构造函数传入activity

     internal class ContentAdapter( private val activity: AppCompatActivity, private var dataList: ArrayList<DataList> ) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener { 

看起来你可能并不熟悉Kotlin与Java不同的方式,并且默认你编写更好的代码。 这可能有助于您完整阅读Kotlin文档。 这不是很长。 我也推荐Kotlin Koans,这是JetBrains提供给Kotlin练习的编码练习。

Kotlin相对Java来说是一个巨大的进步:-)不要让这让你灰心!

(顺便说一句,它看起来像你可以使你的dataList总是优先于var当引用是final

最好使用回调活动来导航到新的片段。

更改构造函数

 internal class ContentAdapter constructor (private var dataList: ArrayList<DataList>,private var callback:()->Unit) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener 

然后在里面

override fun onClick(v: View?)

callback.invoke();

活动将通过设置适配器

 val adapter = ContentAdapter(datalist) { // Code to navigate to new fragment } 
 internal class ContentAdapter (private val activity: Activity, private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener 

您需要在构造函数中传递活动。 对于kotlin还有一个很好的提示:如果你只有一个主构造函数,你不必编写“构造函数”前缀

 internal class ContentAdapter (private val activity: AppCompatActivity, private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener 

当你有活动,你可以访问经理

您需要在构造函数中传递活动。如果您只有一个主构造函数,则不需要编写该函数。

使用Onclick作为onClickListener的替代,你可以像这样使用onClick。

  itemView.regPrice.onClick { / * your action */ }