把rep​​laceFragment放在onBindViewHolder里面对不对?

Is it right to put replaceFragment inside onBindViewHolder?

我正在通过更改 codelabs 中的演示来学习 Jetpack。

我更改的是将 MainActivity.kt 的代码移动到片段中并在片段之间跳转。

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()
}

当我们点击物品时,我们会在WordListAdapter里面调用replaceFragment,然后转到另一个片段如下:

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 中是否正确?

在我看来 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)
        }
    }
}