在RecyclerView中为分隔符添加边距

Ran*_*Guy 22 android divider android-recyclerview

我正在构建一个正在使用的Android应用程序RecyclerView.我想添加分隔符RecyclerView,我使用此代码执行:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), linearLayoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常.但是,分频器的大小是全屏的,我想为它添加边距.有没有办法可以使用一种方法为分隔符添加边距,这种方法会为绘制的矩形添加一些空间,而不是通过创建带边距的自定义可绘制形状并将其添加到RecyclerView

Sep*_*X75 41

我认为最直接的解决方案是在装饰对象上使用setDrawable方法,并使用您想要的边距的插入值传递一个插入的drawable.像这样:

int[] ATTRS = new int[]{android.R.attr.listDivider};

TypedArray a = context.obtainStyledAttributes(ATTRS);
Drawable divider = a.getDrawable(0);
int inset = getResources().getDimensionPixelSize(R.dimen.your_margin_value);
InsetDrawable insetDivider = new InsetDrawable(divider, inset, 0, inset, 0);
a.recycle();

DividerItemDecoration itemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
itemDecoration.setDrawable(insetDivider);
recyclerView.addItemDecoration(itemDecoration);
Run Code Online (Sandbox Code Playgroud)

  • 天才!非常感谢! (3认同)
  • 简单正确的答案。如果您可以重用和修改现有的 ItemDecoration,请不要实现自己的 ItemDecoration。 (2认同)

Dua*_*ral 14

形状文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#E6E7F0" />
    <size android:height="1dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)

层.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/shape"
        android:left="16dp"
        android:right="16dp" />

</layer-list>
Run Code Online (Sandbox Code Playgroud)

代码

val itemDecoration = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
itemDecoration.setDrawable(resources.getDrawable(R.drawable.layer, null))
recyclerView.addItemDecoration(itemDecoration)
Run Code Online (Sandbox Code Playgroud)


SAN*_*PTA 10

使用此选项并根据您的要求进行定制.

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    private Drawable divider;

    /**
     * Default divider will be used
     */
    public DividerItemDecoration(Context context) {
        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
        divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    /**
     * Custom divider will be used
     */
    public DividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();

            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}


Ham*_*ice 6

详细说明@SeptimusX75:如果您(像我一样)更喜欢在 XML 中执行 UI 操作,您可以创建一个嵌入的可绘制文件。您必须创建第二个 XML 文件,但作为回报,您的代码会变得更干净,我认为这是值得的:-)。

[更新] 用户@Zhou Hongbo 在评论中建议,仅使用一个 XML 文件:divider.xml

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/divider_base"
    android:insetRight="20dp"
    android:insetLeft="20dp">

    <shape>
        <android:shape="rectangle">
        <size android:height="1dp" />
        <solid android:color="@color/dividerColor" />
    </shape>

</inset>
Run Code Online (Sandbox Code Playgroud)

[旧答案]:

divider_base.xml (实际的分隔符)

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="@color/dividerColor" />
</shape>
Run Code Online (Sandbox Code Playgroud)

divider.xml (插图)

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/divider_base"
    android:insetRight="20dp"
    android:insetLeft="20dp">
</inset>
Run Code Online (Sandbox Code Playgroud)


Viv*_*hra 5

您可以为回收者视图创建自己的物品装饰。这是相同的代码。

public class SimpleItemDecorator extends RecyclerView.ItemDecoration {

    int space;
    boolean isHorizontalLayout;
    public SimpleItemDecorator(int space) {
        this.space = space;
    }

    public SimpleItemDecorator(int space, boolean isHorizontalLayout) {
        this.space = space;
        this.isHorizontalLayout = isHorizontalLayout;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if(isHorizontalLayout)
        {
            outRect.bottom=space;
            outRect.right=space;
            outRect.left=space;
            outRect.top=space;

        } else {
            outRect.bottom = space;
            if (parent.getChildAdapterPosition(view) == 0)
                outRect.top = space;
            else
                outRect.top = 0;

        }


    }
}
Run Code Online (Sandbox Code Playgroud)

并将其与您的recyclerview一起使用,您可以这样操作:

 recyclerView.addItemDecoration(new SimpleItemDecorator(5));
Run Code Online (Sandbox Code Playgroud)