【发布时间】:2021-02-27 09:26:58
【问题描述】:
StackOverflow 包含很多这样的问题,但到目前为止,绝对没有一个解决方案能 100% 奏效。
我尝试了这些解决方案:
RecyclerView ItemDecoration - How to draw a different width divider for every viewHolder?
first item center aligns in SnapHelper in RecyclerView
Horizontally center first item of RecyclerView
LinearSnapHelper doesn't snap on edge items of RecyclerView
Android Centering Item in RecyclerView
How to make recycler view start adding items from center?
How to snap to particular position of LinearSnapHelper in horizontal RecyclerView?
并且每次第一项无法正确居中。
我正在使用的示例代码
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(
@NonNull Rect outRect,
@NonNull View view,
@NonNull RecyclerView parent,
@NonNull RecyclerView.State state
) {
super.getItemOffsets(outRect, view, parent, state);
final int count = state.getItemCount();
final int position = parent.getChildAdapterPosition(view);
if (position == 0 || position == count - 1) {
int offset = (int) (parent.getWidth() * 0.5f - view.getWidth() * 0.5f);
if (position == 0) {
setupOutRect(outRect, offset, true);
} else if (position == count - 1) {
setupOutRect(outRect, offset, false);
}
}
}
private void setupOutRect(Rect rect, int offset, boolean start) {
if (start) {
rect.left = offset;
} else {
rect.right = offset;
}
}
});
调查后发现是因为getItemOffsets的时候view.getWidth是0,还没有测出来。
我试图强制测量它,但每次它给出的尺寸都不正确,与它实际占据的尺寸完全不同,它更小。
我也尝试使用 addOnGlobalLayoutListener 技巧,但是当它被调用并具有正确的宽度时,outRect 已经被消耗,所以它丢失了。
我不想设置任何固定大小,因为RecyclerView 中的项目可以有不同的大小,因此不能提前设置其填充。
我也不想添加“幽灵”项目来填充空间,这些项目也不能很好地用于滚动体验。
我怎样才能让它正常工作?
理想情况下,ItemDecorator 方法看起来是最好的,但对于第一项,它马上就落伍了。
【问题讨论】:
标签: android android-recyclerview centering item-decoration