Kotlin从Recyclerview新的片段

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

internal class ContentAdapter constructor (private var dataList: ArrayList) : RecyclerView.Adapter(), 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){ 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 } } } 

帮我解决这个问题。

5 Solutions collect form web for “Kotlin从Recyclerview新的片段”

一些解决方案:

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

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

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

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

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

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

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

更改构造函数

 internal class ContentAdapter constructor (private var dataList: ArrayList,private var callback:()->Unit) : RecyclerView.Adapter(), 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) : RecyclerView.Adapter(), View.OnClickListener 

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

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

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

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

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

  itemView.regPrice.onClick { / * your action */ } 
  • 匕首注射不适用于Kotlin的“物体”
  • 如何从命令行运行Kotlin类?
  • 避免Kotlin运行时/ stdlib与其他插件冲突
  • 在比较中无视Triple的组件
  • 如何设置Kotlin的财产价值
  • 在Kotlin中使用延迟初始化和通用工厂方法进行推理
  • 我怎样才能避免在Kotlin空属性
  • 如何使用振动器效果在点击按钮上振动设备? 使用Kotlin
  • 简化代码,除了签名以外,是相同的乐趣(可变参数vs地图)
  • 不能用Dagger2提供合格的字符串
  • 如何在Android Studio中使用Kotlin在RecyclerView上添加Onclick监听器?
  • Kotlin language will be the best programming language for Android.