我有一个管理间距的UiItemDecoration类。
public class UiItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;//一行item数目
private int spacing;//item 之间的间隔
private boolean includeEdge;//边缘
private boolean includeTop;
public UiItemDecoration(int spanCount, int spacing, boolean includeEdge) {
this.spanCount = spanCount;
this.spacing = spacing;
this.includeEdge = includeEdge;
this.includeTop = true;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
outRect.left = 0;
outRect.right = 10;
}
当我想要有相同的间距时它很有效。在下面的图片中显示问题是我想在类中定义的recyclerview的项目之间有不同的间距:
public class UiItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;//一行item数目
private int spacing;//item 之间的间隔
private boolean includeEdge;//边缘
private boolean includeTop;
public UiItemDecoration(int spanCount, int spacing, boolean includeEdge) {
this.spanCount = spanCount;
this.spacing = spacing;
this.includeEdge = includeEdge;
this.includeTop = true;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
if (position%5 == 2){
outRect.right = 30;
}else {
outRect.right = 5;
}
outRect.left = 0;
}
您可以根据适配器的onBindViewHolder()方法中的位置更改边距,而不是更改偏移量。如果您使用RelativeLayout创建项目布局,则此代码将起作用。调整边距也不会影响项目的视图边界。
@Override
public void onBindViewHolder(@NonNull final AdapterViewHolder holder, int position) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) holder.itemView.getLayoutParams();
if (position%5 == 2){
layoutParams.setMargins(0, 0, 30, 0);
}else {
layoutParams.setMargins(0, 0, 5, 0);
}
holder.itemView.setLayoutParams(layoutParams);
}
用这个,
public class ItemOffsetDecoration extends RecyclerView.ItemDecoration {
public static final int SPAN_COUNT = 4;
private static final int DEFAULT_LEFT_OFFSET = 0;
private static final int DEFAULT_RIGHT_OFFSET = 0;
private static final int DEFAULT_TOP_OFFSET = 0;
private static final int DEFAULT_BOTTOM_OFFSET = 0;
private int mItemOffset;
public ItemOffsetDecoration(int itemOffset) {
mItemOffset = itemOffset;
}
/**
* @brief Method to get offset for item views(child)
* and modifying all bounds- top, bottom, left and right for equal spacing.
* @param outRect : Rect, the number of pixels in which a view should be inserted.
* @param view : Views (child) which to be modified or decorated.
* @param parent : Corresponding recycler view where decorations being applied.
* @param state : Recycler view State state, contains focus, scroll etc info.
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
// column count fixed = 5
if (position >= 0) {
int column = position % SPAN_COUNT; // item column
outRect.left = mItemOffset - column * mItemOffset / SPAN_COUNT;
outRect.right = (column + 1) * mItemOffset / SPAN_COUNT;
if (position < SPAN_COUNT) { // top edge
outRect.top = mItemOffset;
}
outRect.bottom = mItemOffset; // item bottom
} else {
outRect.left = DEFAULT_LEFT_OFFSET;
outRect.right = DEFAULT_RIGHT_OFFSET;
outRect.top = DEFAULT_TOP_OFFSET;
outRect.bottom = DEFAULT_BOTTOM_OFFSET;
}
}
}
我正在使用mItemOffset = -6; //使用自己修改
别忘了
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), SPAN_COUNT);//columns
mRecyclerView.setLayoutManager(gridLayoutManager);
mRecyclerView.addItemDecoration(new ItemOffsetDecoration(SPACING));