ViewPager2如何更改子绘图顺序?

时间:2020-01-13 05:31:42

标签: android android-viewpager android-viewpager2

我正在尝试使用重叠的项(类似于组件的轮播)来实现ViewPager2。 一切似乎都很好,但我的中心项目被下一个项目所覆盖。我希望我的中心物品在任何邻居物品的前面。

请参见下图:

enter image description here

当您使用 ViewPager1 类时,我们可以覆盖 getChildDrawingOrder

@Override
    protected int getChildDrawingOrder(int childCount, int i)

在此处查看示例解决方案:link

但是不能派生和扩展ViewPager2(因为ViewPager2类是最终的)。我该怎么办?

2 个答案:

答案 0 :(得分:1)

引擎盖下的ViewPager2包含一个RecyclerView,因此,如果要更改子绘制顺序,则需要在RecyclerView上执行。

虽然这不是官方支持的解决方案,但是您可以通过在视图分页器上要求第一个孩子来访问RecyclerView。看到此评论:

https://issuetracker.google.com/issues/134912610#comment3

val recyclerView = viewPager2.getChildAt(0)

一旦您有权访问RecyclerView,就可以添加ChildDrawingOrderCallback

https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ChildDrawingOrderCallback

如果您刚好有3页,并且希望将中间页绘制在其他页的顶部,则下面的代码可以工作。

  recyclerView.setChildDrawingOrderCallback { childCount, i ->
        when (i) {
            0 -> 0
            1 -> 2
            2 -> 1
            else -> throw IllegalStateException("Expected 3 items")
        }
    }

答案 1 :(得分:0)

经过一番研究,我最终决定摆脱ViewPager2并返回到ViewPager1,因为我可以覆盖 getChildDrawingOrder 函数,然后我跟随this answer来实现我真正想要的。希望ViewPager2何时能很快完成定稿,并使ViewPager2类成为非最终的