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 } } }
帮我解决这个问题。
一些解决方案:
-
Kotlin默认所有的类都是
static
。 你必须选择他们是inner
类。 把这个类放入一个Activity中,然后把这个inner
修饰符加入到这个类中:internal inner class ContentAdapter constructor (private var dataList: ArrayList
-
保持ContentAdapter为
static
,但通过构造函数传入activity
:internal class ContentAdapter( private val activity: AppCompatActivity, private var dataList: ArrayList
看起来你可能并不熟悉Kotlin与Java不同的方式,并且默认你编写更好的代码。 这可能有助于您完整阅读Kotlin文档。 这不是很长。 我也推荐Kotlin Koans,它是JetBrains提供的练习Kotlin的编码练习。
Kotlin相对Java来说是一个巨大的进步:-)不要让这让你灰心!
(顺便说一句,它看起来像你可以使你的dataList
总是优先于var
当引用是final
。
最好使用回调活动来导航到新的片段。
更改构造函数
internal class ContentAdapter constructor (private var dataList: ArrayList
然后在里面
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
您需要在构造函数中传递活动。 对于kotlin还有一个很好的提示:如果你只有一个主构造函数,你不必编写“构造函数”前缀
internal class ContentAdapter (private val activity: AppCompatActivity, private var dataList: ArrayList
当你有活动,你可以访问经理
您需要在构造函数中传递活动。如果您只有一个主构造函数,则不需要编写该函数。
使用Onclick作为onClickListener的替代,你可以像这样使用onClick。
itemView.regPrice.onClick { / * your action */ }