Kotlin:如何在RecyclerView.Adapter中调用getSupportFragmentManager()?

5

在RecyclerView.Adapter中的点击事件后,我想调用Support Fragment Manager以便转到不同的片段。我的做法:

(context as MainActivity).supportFragmentManager
                            .beginTransaction()
                            .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
                            .commit()

但是我遇到了以下错误:
kotlin.TypeCastException:无法将null转换为非空类型
你能帮助我吗?

context is null, just make sure to set a value before casting it to MainActivity - Omar Mainegra
这是一个“类型转换异常”,它说“无法转换为非空类型”,你正在向其传递 null,而该类型不允许 null。在 Kotlin 中,您需要添加“?”以使其可为空。 - Murtaza Khursheed Hussain
4个回答

7

2021年更新 - Kotlin之答案

如果你想在碎片(Fragment)中调用"supportFragmentManager"

activity.supportFragmentManager

0

我建议您在片段/活动中处理片段事务。这将有助于使您的代码更清晰,并且在片段/活动中使用上下文更容易。尝试定义适配器和片段之间的接口,并在适配器中调用您的接口方法,并在活动/片段中实现接口。这样,您就可以轻松地访问上下文。


0

这是因为你在适配器中的Context实例不能保证是一个Activity。它有可能是一个包含Activity作为基础ContextContextWrapper。试图解开这个包装是很脆弱的。

相反地,我建议你在适配器中定义一个接口。从你的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()
}

接下来,在初始化MyAdapterActivity中:

myAdapter.setListener {
    supportFragmentManager
        .beginTransaction()
        .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
        .commit()
}

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)!!
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接