PagerSnapHelper центрирует элементы RecyclerView , включая декорации, поэтому, если ширина декораций не сбалансирована, они не всегда будут центрированы.Это может быть то, что вы видите.
Попробуйте следующее для украшения.Этот код применяет художественное оформление полной ширины к началу первого элемента и концу последнего элемента;в противном случае используется половина декоративной ширины.Настраивая декорации таким образом, вы центрируете элементы, которые сбалансировали левую и правую декорации.
DividerItemDecoration decoration =
new DividerItemDecoration(getApplicationContext(), HORIZONTAL) {
private int mDecorationWidth = (int) (getResources().getDisplayMetrics().density * 8);
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
final int pos = parent.getChildAdapterPosition(view);
if (pos == RecyclerView.NO_POSITION) {
return;
}
if (pos == 0) {
outRect.set(mDecorationWidth, 0, mDecorationWidth / 2, 0);
} else if (pos == parent.getAdapter().getItemCount() - 1) {
outRect.set(mDecorationWidth / 2, 0, mDecorationWidth, 0);
} else {
outRect.set(mDecorationWidth / 2, 0, mDecorationWidth / 2, 0);
}
}
};
Вот видео, показывающее результаты с серыми вертикальными разделителями.
![enter image description here](https://i.stack.imgur.com/pXYJp.gif)
Если у вас уже есть украшения, работающие к вашему удовлетворению, вы можете переопределить calculateDistanceToFinalSnap()
в PagerSnapHelper , чтобы центрировать все представления, кроме первого и последнего, следующим образом.См. расчетное сопротивление финала () .Как только PageSnapHelper идентифицирует целевой вид для привязки, вызывается calculatedistancetofinalsnap()
, чтобы определить, сколько пикселей нужно переместить для выполнения привязки.Здесь мы перемещаем достаточно пикселей для центрирования вида (без декораций) в RecyclerView . PageSnapHelper делает правильные вещи для первого и последнего элементов, поэтому мы просто вызываем супер для них.
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper() {
@Override
public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,
@NonNull View targetView) {
LinearLayoutManager lm = (LinearLayoutManager) layoutManager;
int pos = mRecycler.getChildAdapterPosition(targetView);
// If first or last view, the default implementation works.
if (pos == 0 || pos == lm.getItemCount() - 1) {
return super.calculateDistanceToFinalSnap(layoutManager, targetView);
}
// Force centering in the view without its decorations.
// targetCenter is the location of the center of the view we want to center.
int targetCenter = targetView.getLeft() + targetView.getWidth() / 2;
// Distance is the number of pixels to move the target so that its center
// lines up with the center of the RecyclerView (mRecycler.getWidth() / 2)
int distance = targetCenter - mRecycler.getWidth() / 2;
return new int[]{distance, 0};
}
};
В любом случае будет работать.