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

Sim*_*sen 5 android kotlin

我想在单击事件后调用 RecyclerView.Adapter 中的支持片段管理器,以便移动到不同的片段。我的做法:

(context as MainActivity).supportFragmentManager
                            .beginTransaction()
                            .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
                            .commit()
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

kotlin.TypeCastException:null 无法转换为非 null 类型

你能帮助我吗?

can*_*ler 7

2021 年更新 - Kotlin 答案

如果你想在Fragment中调用“supportFragmentManager”

activity.supportFragmentManager
Run Code Online (Sandbox Code Playgroud)


kco*_*ock 0

这是因为Context适配器中的实例不能保证是Activity. 它可能是一个作为基地的ContextWrapper基地。试图解开这个包裹是很脆弱的。ActivityContext

相反,我建议您在适配器中定义一个接口。从您的 中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()
}
Run Code Online (Sandbox Code Playgroud)

然后,在Activity初始化中MyAdapter

myAdapter.setListener {
    supportFragmentManager
        .beginTransaction()
        .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
        .commit()
}
Run Code Online (Sandbox Code Playgroud)