还有点bug,建议使用 LinearSnapHelper
rvPilotList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy);// offsetY += dy;//// int first = linearLayoutManager.findFirstCompletelyVisibleItemPosition();// int last = linearLayoutManager.findLastCompletelyVisibleItemPosition();// View firstview = linearLayoutManager.findViewByPosition(first);// if (viewWidth == 0) {// viewWidth = firstview.getHeight();// }// int offseta = firstview.getTop();// float sx = 1f + (float) offseta / viewWidth;// if (offsetY == 0) {// View view = linearLayoutManager.findViewByPosition(first + 1);// scaleUp(view);// }//// firstview.setScaleX(sx);// View lastview = linearLayoutManager.findViewByPosition(last);// offseta = recyclerView.getHeight() - lastview.getBottom();// sx = 1f + (float) offseta / viewWidth;// lastview.setScaleX(sx); } @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == 0) { int visibleItem = linearLayoutManager.getChildCount(); int coun = 0; if (visibleItem % 2 == 1) { coun = (visibleItem - 1) / 2; } else { coun = visibleItem / 2; } Log.i(TAG, "onScrollStateChanged: " + visibleItem); Log.i(TAG, "onScrollStateChanged: coun" + coun); int postion = linearLayoutManager.findFirstVisibleItemPosition(); Log.i(TAG, "onScrollStateChanged: postion" + postion); View view; Log.i(TAG, "findFirstCompletelyVisibleItemPosition: " + linearLayoutManager.findFirstCompletelyVisibleItemPosition()); if (postion == 0 && linearLayoutManager.findFirstCompletelyVisibleItemPosition() != 0) { view = linearLayoutManager.findViewByPosition(0); } else { view = linearLayoutManager.findViewByPosition(postion + coun); } int pm = ((ViewGroup) view.getParent()).getMeasuredWidth(); int left = view.getLeft() + view.getWidth() / 2; int offset = 0; if (left == pm / 2) { return; } if (left < pm / 2) { offset = -(pm / 2 - left); } else { offset = left - pm / 2; } rvPilotList.smoothScrollBy(offset, 0); } } });