android - 修改子项时 ViewPager2 转到第一页
问题描述
我有一个带有 FragmentStateAdapter 和未知页数的 ViewPager2;每个 Fragment 子项内部都有一个 recyclerView 和所有 Fragment 之间的共享视图模型。
我收听共享视图模型的 livedata(因为所有片段都在收听相同的 livedata);当 livedata 被触发时,我会更新每个片段内的 recyclerView。
但是,当 recyclerview 更新发生时,ViewPager 会自动转到第一页,完全破坏了用户体验。
有没有办法在修改数据时不返回第一页?
#更新 02/03/2021
我的 FragmentStateAdapter 子类:
class IngredientsViewPagerAdapter(fragment: Fragment, private val ingredientType: Int) :
FragmentStateAdapter(fragment) {
private var numberOfPages : Int = 0
fun setNumberOfPages(numberOfPages : Int){
if (this.numberOfPages != numberOfPages) {
this.numberOfPages = numberOfPages
notifyDataSetChanged()
}
}
override fun getItemCount(): Int {
return numberOfPages
}
override fun createFragment(position: Int): Fragment {
return CustomDrinkIngredientsPagerFragment.newInstance(position, ingredientType)
}}
使用的片段:
class CustomDrinkIngredientsPagerFragment : Fragment(R.layout.view_pager_standard_drinks),
IngredientsListAdapter.IngredientListAdapterInterface{
private val customDrinkViewModel : CustomDrinkViewModel by activityViewModels()
private lateinit var rvIngredients : RecyclerView
private val ingredientListAdapter = IngredientsListAdapter(emptyList(), this@CustomDrinkIngredientsPagerFragment)
private val position by lazy {
requireArguments().getInt("position")
}
private val ingredientType by lazy {
requireArguments().getInt("ingredientType")
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
rvIngredients = view.findViewById(R.id.list_recycler_view)
rvIngredients.apply {
layoutManager =
GridLayoutManager(requireContext(), 4, GridLayoutManager.VERTICAL, false)
adapter = ingredientListAdapter
}
customDrinkViewModel.ingredients.observe(viewLifecycleOwner) {
ingredientListAdapter.submitList(it[ingredientType]!![position])
Log.d("ROB", "Observed ingredients iType:${ingredientType} position:${position}")
}
}
override fun onIngredientSelected(ingredient: Ingredient) {
customDrinkViewModel.addIngredient(ingredient)
}
companion object {
@JvmStatic
fun newInstance( position : Int, ingredientType : Int): CustomDrinkIngredientsPagerFragment{
val args = Bundle()
args.putInt("position", position)
args.putInt("ingredientType", ingredientType)
val fragment = CustomDrinkIngredientsPagerFragment()
fragment.arguments = args
return fragment
}
}}
解决方案
我发现了问题:它是父 ViewPager(上面的 ViewPager)。我认为问题出在第二个 ViewPager,而不是父级。
实际结构是:ViewPager -> ViewPager -> Fragment with RecyclerView。
修改第二个ViewPager child,第一个ViewPager被通知修改了一个child,并自动触发notifyDatasetChanged(跳转到第0页)
推荐阅读
- android - Firebase 未生成 FCM 令牌
- algorithm - 是否可以将所有 AVL 树转换为红黑树?
- react-native - 如何在 react-native 中创建图像对象?
- javascript - 如何对齐打印页面的内容?
- apache-spark - spark上的hive如何确定reducer数量?
- ios - 在应用程序处于后台状态时进行服务调用
- angular - 如何修复 Schema 验证失败并出现以下错误:在 ng serve 之后
- python - 将图像文本写入新的文本文件?
- .htaccess - 在 htaccess auth 后面使用 jenkins api 和基本身份验证
- typescript - 如何在 Typescript 中正确定义全局枚举