我无法在网上找到这个问题的答案,所以答案必须如此简单,以至于没有人会去问它,而我根本就不知道。
基本上,我想在我的recyclerView AND中的每个项目与RecyclerView的底部之间添加一条水平线。我找到了一种在RecyclerView中的每个项目之间放置分隔符的方法,但在 end 中没有。
将负数int放入addItemDecoration(RecyclerView.ItemDecoration装饰, int index)。应该解决这个问题,说明:
如果此值为负,则将在末尾添加装饰。
这是我的自定义RecyclerView的构造方法:
public CustomRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setHasFixedSize(true);
setLayoutManager(new LinearLayoutManager(context));
decor = new HorizontalDividerItemDecoration.Builder(context).build();
addItemDecoration(decor, -1);
}
正如你所看到的,我在addItemDecoration()中使用了一个负整数,我无法弄清楚为什么它不按预期方式工作。
非常感谢任何帮助!
答案 0 :(得分:4)
根据Janice Kartika的建议,我将代码复制并粘贴到我的项目中。复制并粘贴Janice的代码后,Android Studio给了我这个建议:
替换为android.support.v7.widge.DividerItemDecoration?
旧版本的RycyclerView库没有包含分隔符装饰器,但是在支持演示中提供了一个样本。此分隔符类已被广泛复制/粘贴到各种项目中。
在最新版本的支持库中,现在包含了分隔符装饰器,因此您可以使用"内置"替换自定义副本。 version,android.support.v7.widget.DividerItemDecoration
所以不要使用HorizontalDividerItemDecoration(它是我们导入的外部库的一部分),而不是这样:
decor = new HorizontalDividerItemDecoration.Builder(context).build();
addItemDecoration(decor, -1);
我使用了默认的" DividerItemDecoration"像这样:
decor = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
addItemDecoration(decor);
它有效。如果你没有把" int index"在addItemDecoration中,它默认为-1并默认将装饰添加到底部。
答案 1 :(得分:3)
我很久以前遇到了同样的问题,我可以通过this链接复制粘贴DividerItemDecoration
类来解决这个问题。但是现在似乎有些方法已被弃用,所以我对它做了一些修改:
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
private static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
private static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
将其复制粘贴到您的项目中,并按照以下方式使用它:
public CustomRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setHasFixedSize(true);
setLayoutManager(new LinearLayoutManager(context));
addItemDecoration(new DividerItemDecoration(context, LinearLayoutManager.VERTICAL));
}