把replaceFragment放在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)
}
}
}
我正在通过更改 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)
}
}
}