Котлин: Как вызвать getSupportFragmentManager () в RecyclerView.Adapter - PullRequest
0 голосов
/ 02 января 2019

Я бы хотел вызвать диспетчер фрагментов поддержки в моем RecyclerView.Adapter после события click, чтобы перейти к другому фрагменту. Мой подход:

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

Но я получаю следующую ошибку:

kotlin.TypeCastException: ноль не может быть приведен к непустому типу

Вы можете мне помочь?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Я предлагаю вам обработать ваш фрагмент транзакции в вашем fragment/activity. Это поможет вам получить более чистый код, а использование контекста в fragment/activity будет намного проще. Попробуйте определить интерфейс между вашим адаптером и фрагментом, вызвать метод интерфейса в адаптере и реализовать интерфейс в activity/fragment. Там вы можете легко получить доступ к контексту.

0 голосов
/ 03 января 2019

получить активность или фрагмент в качестве аргумента в вашем адаптере.

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)!!
    }
}
0 голосов
/ 02 января 2019

Это потому, что ваш 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, который инициализирует MyAdapter:

myAdapter.setListener {
    supportFragmentManager
        .beginTransaction()
        .replace(MainActivity.FRAGMENT_CONTAINER, TextScreen())
        .commit()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...