Recyclerview 作为 Snappy Gallery

Recyclerview as Snappy Gallery

我一直想自己解决这个问题,但没有机会。

我需要的是 RecyclerView(水平滚动)始终显示 3 个项目。每当用户左右滑动或滚动时,它应该捕捉到接下来的 3 个项目,如果还有的话。如果有的话,我只是在寻找最简单的解决方案。

我找到了具有单个项目的图库解决方案,但我需要 3 个项目。我知道这一定是可能的,但我真的不知道怎么做。首先,LayoutManager 应该计算项目宽度以使其与设备的宽度相匹配。我想我需要以某种方式使用 RecyclerView.OnScrollListener

有人可以帮我吗?

我假设画廊的每一页都是 3 项的垂直列表是否正确?

在覆盖 LayoutManager.onMeasure(Recycler, int, int, int) 的范围内调用 getWidth()getHeight() 以获得回收站的实际大小。然后,您可以在 onLayoutChildren() 中使用它来计算子项应该有多大。

至于滚动到下一个视图,我不太确定。也许像 RecyclerView horizontal snap in center?

那样向 RecyclerView 添加自定义 OnScrollListener

我有一个类似的用例,使用这个 SO 线程中的建议我得到了很好的结果:

Snappy scrolling in RecyclerView

结果是:使用自定义RecyclerView.OnScrollListener检测滚动状态何时变为SCROLL_STATE_IDLE,此时使用实现getFixScrollPos()的LayoutManager的子类计算然后滚动到正确的位置,过程中卡住。

我还能够在设计时使用可设置样式的属性来设置行中的项目数。您可能也想这样做。

使用 LinearSnapHelper,这现在非常容易。

您需要做的就是:

SnapHelper helper = LinearSnapHelper();
helper.attachToRecyclerView(recyclerView);

就这么简单!请注意,从版本 24.2.0 开始,支持库中添加了 LinearSnapHelper