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

时间:2019-01-02 16:21:48

标签: android kotlin

在单击事件之后,我想在RecyclerView.Adapter中调用支持片段管理器,以便移至其他片段。我的方法:

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

但是出现以下错误:

  

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

你能帮我吗?

4 个答案:

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