繁体   English   中英

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

[英]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()
}

然后,在初始化MyAdapterActivity中:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM