Правильно ли помещать replaceFragment внутри onBindViewHolder? - PullRequest
0 голосов
/ 18 июня 2020
• 1000
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        replaceFragment(WordListFragment())
    }
}

// Extension function to replace fragment
fun AppCompatActivity.replaceFragment(fragment: Fragment){
    val fragmentManager = supportFragmentManager
    val transaction = fragmentManager.beginTransaction()
    transaction.replace(R.id.host,fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

Когда мы нажимаем на элементы, мы вызываем replaceFragment внутри WordListAdapter и go для другого фрагмента следующим образом:

enter image description here

class WordListAdapter : RecyclerView.Adapter<WordListAdapter.WordViewHolder>() {
    ...
    override fun onBindViewHolder(holder: WordViewHolder, position: Int) {

        val current = words[position]
        holder.wordItemView.text = current.word

        holder.itemView.setOnClickListener {
            // fire recyclerView click event
            val activity = it.context as AppCompatActivity
            val args = Bundle()
            // Send string data as key value format
            args.putString("word", current.word)
            val fragment = WordDefinitionFragment()
            fragment.arguments = args
            activity.replaceFragment(fragment)

        }
    }

Мне просто интересно, правильный ли способ поместить replaceFragment в onBindViewHolder?

1 Ответ

1 голос
/ 18 июня 2020

На мой взгляд, RecyclerView.Adapter должен только связывать неизменяемые данные и передавать клики через обратные вызовы, а Activity должен быть тем, который изменяет фрагмент. На мой взгляд, вы должны сделать что-то вроде этого:

class WordListAdapter(private val onViewHolderClicked: (String) -> Unit) : RecyclerView.Adapter<WordListAdapter.WordViewHolder>() {
    ...
    override fun onBindViewHolder(holder: WordViewHolder, position: Int) {

        val current = words[position]
        holder.wordItemView.text = current.word

        holder.itemView.setOnClickListener {
            onViewHolderClicked(current.word)
        }
    }

и в Activity:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        replaceFragment(WordListFragment())
    }
...
    fun setupRecyclerView() {
        ...
        val adapter = WordListAdapter() { word ->
            val args = Bundle()
            // Send string data as key value format
            args.putString("word", word)
            val fragment = WordDefinitionFragment()
            fragment.arguments = args
            replaceFragment(fragment)
        }
    }
}
...