修改子项时 ViewPager2 转到第一页

Posted

技术标签:

【中文标题】修改子项时 ViewPager2 转到第一页【英文标题】:ViewPager2 goes to first page when a child is modified 【发布时间】:2021-05-31 05:55:32 【问题描述】:

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

我监听共享视图模型的 livedata(因为所有片段都在监听相同的 livedata);当 livedata 被触发时,我会更新每个片段中的 recyclerView。

但是,当 recyclerview 更新时,ViewPager 会自动转到第一页,完全破坏了用户体验。

有没有办法在修改数据时不返回第一页?

#UPDATE 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
    

【问题讨论】:

任何一段代码都会有所帮助。 FragmentStateAdapter 基于 RecyclerView.Adapter,可能某些数据更新会重置视图(滚动到开头)。但正如 android Killer 所说,一些代码会有所帮助。 @AndroidKiller 更新了当前使用的代码 【参考方案1】:

我发现了问题:它是父 ViewPager(上面的 ViewPager 的)。 我认为问题出在第二个 ViewPager,而不是父级。

实际结构是:ViewPager -> ViewPager -> Fragment with RecyclerView。

修改第二个ViewPager child,通知第一个ViewPager修改了一个child,并自动触发notifyDatasetChanged(跳转到第0页)

【讨论】:

以上是关于修改子项时 ViewPager2 转到第一页的主要内容,如果未能解决你的问题,请参考以下文章

网页设计中页面默认为第二页,如何用js实现点击上一页跳转到第一页,点击下一页跳转

如何让 uipageviewcontroller 转圈

是否可以循环 UIScrollView/UIPageControl?

点击第二页中的滚动视图时滚动到第一页

jqgrid删除之后怎么回到第一页

layui中上一页,下一页,跳转到第几页,确定如何变为英文