要实现Android水平RecyclerView自动滚动到中心的功能,可以按照以下步骤进行:
创建一个自定义的RecyclerView.Adapter,并继承自RecyclerView.Adapter
在Activity或Fragment中,通过findViewById找到RecyclerView控件,并设置其LayoutManager为一个自定义的LinearLayoutManager。这个LinearLayoutManager需要重写scrollHorizontallyBy方法,以实现自定义的滚动逻辑。
recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) {
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
int scrolled = super.scrollHorizontallyBy(dx, recycler, state);
if (!isScrolling) {
centerItem();
}
return scrolled;
}
};
recyclerView.setLayoutManager(linearLayoutManager);
MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
isScrolling = newState != RecyclerView.SCROLL_STATE_IDLE;
if (!isScrolling) {
centerItem();
}
}
});
private void centerItem() {
int firstVisibleItemPosition = findFirstVisibleItemPosition();
int lastVisibleItemPosition = findLastVisibleItemPosition();
int centerPosition = (firstVisibleItemPosition + lastVisibleItemPosition) / 2;
View centerView = findViewByPosition(centerPosition);
int recyclerViewCenterX = getWidth() / 2;
int viewCenterX = (getDecoratedLeft(centerView) + getDecoratedRight(centerView)) / 2;
int dx = viewCenterX - recyclerViewCenterX;
smoothScrollBy(dx, 0);
}
private int findFirstVisibleItemPosition() {
View child = findOneVisibleChild(0, getChildCount(), false, true);
return child != null ? getPosition(child) : RecyclerView.NO_POSITION;
}
private int findLastVisibleItemPosition() {
View child = findOneVisibleChild(getChildCount() - 1, -1, false, true);
return child != null ? getPosition(child) : RecyclerView.NO_POSITION;
}
private View findViewByPosition(int position) {
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
if (getPosition(child) == position) {
return child;
}
}
return null;
}
private View findOneVisibleChild(int fromIndex, int toIndex, boolean completelyVisible,
boolean acceptPartiallyVisible) {
OrientationHelper helper = OrientationHelper.createOrientationHelper(this, getOrientation());
int start = helper.getStartAfterPadding();
int end = helper.getEndAfterPadding();
int next = toIndex > fromIndex ? 1 : -1;
for (int i = fromIndex; i != toIndex; i += next) {
View child = getChildAt(i);
int childStart = helper.getDecoratedStart(child);
int childEnd = helper.getDecoratedEnd(child);
boolean childIsVisible;
if (completelyVisible) {
childIsVisible = childStart >= start && childEnd <= end;
} else {
childIsVisible = childStart < end && childEnd > start;
}
if (childIsVisible) {
if (acceptPartiallyVisible) {
return child;
} else if (helper.getDecoratedStart(child) >= start &&