2017-06-20 221 views
3

我想用RecyclerView来模拟MultiViewPager的行为,特别是我希望在屏幕中心的选定项目包括第一个和最后一个元素RecyclerView的水平居中第一项

正如你可以在这张图片中看到的,第一个项目居中,这将是我的预期结果。 Expected result

我所做的就是建立一个RecyclerView与水平LinearLayoutManagerLinearSnapHelper。这个解决方案的问题是,第一个和最后一个项目将永远不会水平居中作为选择。我是否应该切换我的代码,以便它使用MultiViewPager或者是否可以利用RecyclerView获得类似的结果?

回答

6

您可以在getItemOffsets()中用RecyclerView.ItemDecoration执行此操作,以适当地补偿第一个和最后一个项目。

检索给定项目的任何偏移量。 outRect的每个字段指定项目视图应插入的像素数量,类似于填充或边距。默认实现将outRect的边界设置为0并返回。

如果您需要访问适配器以获取其他数据,则可以拨打getChildAdapterPosition(View)以获取View的适配器位置。

您可能还需要使用物品的粗糙尺寸以及RecyclerView。但是这些信息无论如何都可以使用。

+1

在我看来这是正确的方式,@CzarMatt的其他答案的建议可能会起作用,但对我来说似乎有点哈克。 – Vektor88

+0

@ Vektor88,'装饰'的使用并不像它看起来那么好。我是这么做的,但是它打破了很多'RecyclerView'规则,因为'装饰'是为了作为项目的扩展。这意味着居中的左/右偏移将被视为真实视图'padding/margin',因此它的'LayoutManager.getDecoratedMeasuredWidth()'将会非常大。它会中断,例如'LinearSnapHelper'。第一个/最后一个元素将被收缩到next/prev上,即使是轻微的触摸,因为他们认为你的视图是胡德。 – Nexen

+3

@ Vektor88,这是更可取的方式去 - https:// stackoverflow。com/q/29117916/2653714 – Nexen

1

该解决方案的问题是第一个和最后一个项目 将永远不会水平居中为选择。

这可能是因为您的RecycleView负责在其布局范围内显示您的数据集内的项目数量。

在您提供的示例图片中,您可以通过在数据集的第一个和最后一个位置添加一个“占位符”项目来实现该效果。这样,您可以让一个隐形物品占据第一个插槽,从而抵消您想要居中的物品。

此占位符项目不应对触摸事件作出响应,也不应干扰处理其他项目上的点击事件(特别是位置处理)。

您将不得不修改适配器getItemCount或许还有getItemType