在单击事件之后,我想在RecyclerView.Adapter中调用支持片段管理器,以便移至其他片段。我的方法:
(context as MainActivity).supportFragmentManager
.beginTransaction()
.replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
.commit()
但是出现以下错误:
kotlin.TypeCastException:无法将null强制转换为非null类型
你能帮我吗?
答案 0 :(得分:1)
2020年6月15日- 科特琳答案
如果要在 Fragment 中调用“ supportFragmentManager” :
activity.supportFragmentManager
@canerkaseler
答案 1 :(得分:0)
这是因为不能保证您在适配器中的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()
}
然后,在初始化Activity
的{{1}}中:
MyAdapter
答案 2 :(得分:0)
我建议您在fragment/activity
中处理片段交易。这将帮助您获得更简洁的代码,并且在fragment/activity
中使用上下文要容易得多。尝试定义适配器和片段之间的接口,并在适配器中调用接口方法,并在activity/fragment
中实现该接口。在那里,您可以轻松访问上下文。
答案 3 :(得分:0)
在适配器中获取活动或片段作为参数。
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)!!
}
}