繁体   English   中英

如何在 Recyclerview 中将 Clicked 位置居中

[英]How to center the Clicked position in the Recyclerview

我想在Recyclerview中将点击位置居中。 我能够将Recyclerview滚动到某个位置,但我想在屏幕中居中该位置。 我用这个方法滚动到那个位置。

videoRecyclerview.scrollToPosition(position);

如果您使用的是RecyclerViewLinearLayoutManager这将起作用:

private void scrollToCenter(View v) {
    int itemToScroll = mRecyclerView.getChildPosition(v);
    int centerOfScreen = mRecyclerView.getWidth() / 2 - v.getWidth() / 2;
    mLayoutManager.scrollToPositionWithOffset(itemToScroll, centerOfScreen);
}

如果您使用linearlayoutManager,则可以使用此代码,

linearLayoutManager.scrollToPositionWithOffset(2, 20);

(linearLayoutManager.void scrollToPositionWithOffset (int position, 
            int offset))

将偏移量设置为 0 应与顶部对齐

首先移动滚动到您的项目,但是每当 recyclerView 滚动时,它只会将项目带到可见区域,永远无法确定该项目是否位于中心,因此我们找到中心项目,然后检查我们是否在中心旁边项目或背后,这是工作逻辑

recyclerView.smoothScrollToPosition(index);
int firstVisibleItemPosition = rvLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = rvLayoutManager.findLastVisibleItemPosition();

int centerPosition = (firstVisibleItemPosition + lastVisibleItemPosition) / 2;

    if (index > centerPosition) {
        recyclerView.smoothScrollToPosition(index + 1);
    } else if (index < centerPosition) {
        recyclerView.smoothScrollToPosition(index - 1);
    }

如果您需要水平和垂直方向的 LieanerLayoutManager平滑滚动到中心

复制整个代码并简单地调用** scrollToCenter

public void scrollToCenter(LinearLayoutManager layoutManager, RecyclerView recyclerList, int clickPosition) {
    RecyclerView.SmoothScroller smoothScroller = createSnapScroller(recyclerList, layoutManager);

    if (smoothScroller != null) {
        smoothScroller.setTargetPosition(clickPosition);
        layoutManager.startSmoothScroll(smoothScroller);
    }
}

// This number controls the speed of smooth scroll
private static final float MILLISECONDS_PER_INCH = 70f;

private final static int DIMENSION = 2;
private final static int HORIZONTAL = 0;
private final static int VERTICAL = 1;

@Nullable
private LinearSmoothScroller createSnapScroller(RecyclerView mRecyclerView, RecyclerView.LayoutManager layoutManager) {
    if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
        return null;
    }
    return new LinearSmoothScroller(mRecyclerView.getContext()) {
        @Override
        protected void onTargetFound(View targetView, RecyclerView.State state, Action action) {
            int[] snapDistances = calculateDistanceToFinalSnap(layoutManager, targetView);
            final int dx = snapDistances[HORIZONTAL];
            final int dy = snapDistances[VERTICAL];
            final int time = calculateTimeForDeceleration(Math.max(Math.abs(dx), Math.abs(dy)));
            if (time > 0) {
                action.update(dx, dy, time, mDecelerateInterpolator);
            }
        }


        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
            return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
        }
    };
}


private int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) {
    int[] out = new int[DIMENSION];
    if (layoutManager.canScrollHorizontally()) {
        out[HORIZONTAL] = distanceToCenter(layoutManager, targetView,
                OrientationHelper.createHorizontalHelper(layoutManager));
    }

    if (layoutManager.canScrollVertically()) {
        out[VERTICAL] = distanceToCenter(layoutManager, targetView,
                OrientationHelper.createHorizontalHelper(layoutManager));
    }
    return out;
}


private int distanceToCenter(@NonNull RecyclerView.LayoutManager layoutManager,
                             @NonNull View targetView, OrientationHelper helper) {
    final int childCenter = helper.getDecoratedStart(targetView)
            + (helper.getDecoratedMeasurement(targetView) / 2);
    final int containerCenter;
    if (layoutManager.getClipToPadding()) {
        containerCenter = helper.getStartAfterPadding() + helper.getTotalSpace() / 2;
    } else {
        containerCenter = helper.getEnd() / 2;
    }
    return childCenter - containerCenter;
}

这段代码对我有用:

 layoutManager.scrollToPositionWithOffset(pos - 1,0);

有史以来最简单的 hack,这对我来说已经足够了:

videoRecyclerview.scrollToPosition(position+2);

如果 position+2 在数组列表中。

//on the click callback 
    view.OnClickListener { callback?.onItemClicked(it)}        



// code in activity or your fragment
override fun onItemClicked(view: View) {
  val position = recyclerView.getChildLayoutPosition(view)
  recyclerView.smoothScrollToPosition(position)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM