[英]Kotlin: How to call getSupportFragmentManager() in RecyclerView.Adapter
我想在单击事件后调用 RecyclerView.Adapter 中的 Support Fragment Manager 以移动到不同的片段。 我的做法:
(context as MainActivity).supportFragmentManager
.beginTransaction()
.replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
.commit()
但我收到以下错误:
kotlin.TypeCastException:null 不能转换为非 null 类型
你能帮助我吗?
这是因为适配器中的Context
实例不能保证是Activity
。 它可能是一个ContextWrapper
持有Activity
作为基础Context
。 试图打开它会很脆弱。
相反,我建议您在适配器中定义一个接口。 从您的Activity
,向将执行FragmentTransaction
适配器提供此接口的实现。 例如:
class MyAdapter : RecyclerView.Adapter<MyType> {
private var listener: (() -> Unit)? = null
fun setListener(listener: (() -> Unit)?) {
this.listener = listener
}
// wherever your onClick is handled:
listener?.invoke()
}
然后,在初始化MyAdapter
的Activity
中:
myAdapter.setListener {
supportFragmentManager
.beginTransaction()
.replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
.commit()
}
2020 年 6 月 15 日 - Kotlin 答案
如果你想在Fragment 中调用“supportFragmentManager” :
activity.supportFragmentManager
我建议你在你的fragment/activity
处理你的 fragment 事务。 这将帮助您拥有更清晰的代码,并且在fragment/activity
使用上下文要容易得多。 尝试定义您的适配器和片段之间的接口,并在适配器中调用您的接口方法并在activity/fragment
实现该接口。 在那里您可以轻松访问上下文。
在您的适配器中获取活动或片段作为参数。
class ArticleAdapter(private val articleActivity: ArticleActivity, private val docs: List<ArticleResult.ArticleDoc>) : RecyclerView.Adapter<ArticleAdapter.Holder>() {
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): Holder = Holder(LayoutInflater.from(p0.context).inflate(R.layout.row_general2, p0, false))
override fun getItemCount(): Int = docs.size
override fun onBindViewHolder(holder: Holder, position: Int) {
articleActivity.supportFragmentManager
}
class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textViewTitleRow = itemView.findViewById<TextView>(R.id.textViewTitleRow)!!
val textView1Row = itemView.findViewById<TextView>(R.id.textView1Row)!!
val textView2Row = itemView.findViewById<TextView>(R.id.textView2Row)!!
val imageViewDownloadRow = itemView.findViewById<ImageView>(R.id.imageViewDownloadRow)!!
val textViewMoreRow = itemView.findViewById<TextView>(R.id.textViewMoreRow)!!
val imageViewBookRow = itemView.findViewById<ImageView>(R.id.imageViewBookRow)!!
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.