修改子项时,ViewPager2 转到第一页

ViewPager2 goes to first page when a child is modified

我有一个带有 FragmentStateAdapter 和未知页数的 ViewPager2;每个 Fragment child 内部都有一个 recyclerView 和所有 fragment 之间的共享视图模型。

我监听共享视图模型的实时数据(因为所有片段都在监听相同的实时数据);当 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 -> ViewPager -> Fragment with RecyclerView。

修改第二个ViewPager子节点,通知第一个ViewPager子节点被修改并自动触发notifyDatasetChanged(跳转到第0页)