加载时将Recyclerview项目捕捉到中心

时间:2017-03-29 11:04:50

标签: android android-recyclerview horizontal-scrolling linearlayoutmanager

我正在使用无限卷轴进行recyclerview,并重复使用X项。 此外,我想使用 PagerSnapHelper()来捕捉像viewpager一样的滚动。

所以最初加载列表时显示如下: enter image description here

一旦我开始向左或向右滚动, PageSnapHelper()就会像工作中心对齐一样快速地进行工作 - enter image description here

我想在初始加载时将recyclerview显示为第二张图像。请告诉我们接下来该怎么做才能实现。

这是代码snipet -

linearLayoutManager = new LinearLayoutManager(mContext,   LinearLayoutManager.HORIZONTAL, false);
this.recyclerView.setLayoutManager(linearLayoutManager);
SnapHelper snapHelper = new PagerSnapHelper();
adapterCarousel = new AdapterCarousel(mContext, glideRequestManager);
adapterCarousel.setViewType(RECYCLER_VIEW_TYPE_NORMAL);
adapterCarousel.setCarousel(carousel);
this.recyclerView.setAdapter(adapterCarousel);
snapHelper.attachToRecyclerView(recyclerView);
linearLayoutManager.scrollToPosition(Integer.MAX_VALUE / 2);

3 个答案:

答案 0 :(得分:2)

我使用LinearLayoutManager#scrollToPositionWithOffset(pos, offset)解决了这个问题。我只是将滚动位置偏移了项目之间填充的一半。这对我有用,因为我的项目宽度与屏幕相同。在你的情况下,你需要做一些数学。

假设您的商品宽度为W,您的RecyclerView宽度为rvW,商品之间的填充为padding,那么您想要抵消的金额由{{1}给出}或(rvW - W)/2 - padding/2

最终代码:

(rvW - W - padding)/2

代码的一些可选改进:

  • 如果您确定RecyclerView始终符合屏幕的宽度,则可以使用// post to give the recyclerview time to layout so it's width isn't 0 mRecyclerView.post(new Runnable() { void run() { int padding = getResources().getDimensionPixelSize(R.dimen.some_padding); int rvWidth = mRecyclerView.getWidth(); int itemWidth = getResources().getDimensionPixelSize(R.dimen.itemWidth); int offset = (rvWidth - itemWidth - padding) / 2; mLinearLayoutManager.scrollToPositionWithOffset(pos, offset); } }); View#measure(),甚至是显示器的宽度,而不是发布到RecyclerView。

  • 如果您的RecyclerView的子项大小可变,您可以通过View#getMeasuredWidth()获取视图并以此方式获取宽度。

答案 1 :(得分:0)

对我来说使用recyclerView.smoothScrollToPosition(x);代替linearLayoutManager.scrollToPosition(x);做了诀窍

答案 2 :(得分:0)

   linearLayoutManager.scrollToPosition((Integer.MAX_VALUE / 2)-1);
   linearLayoutManager.smoothScrollToPosition(Integer.MAX_VALUE / 2);

如果有更好的方法,请告诉我