【问题标题】:Android: Adding a border and rounding to recyclerView itemsAndroid:为 recyclerView 项目添加边框和舍入
【发布时间】:2017-06-12 11:39:07
【问题描述】:

我目前设置了一个 recyclerView,以便在每个项目的底部添加一个阴影,间距效果很好。如果可能,我想在每个项目周围添加一个细灰色边框以及一个柔和的舍入。到目前为止的代码:

    public class VerticalSpaceItemDecorator extends RecyclerView.ItemDecoration {

    private final int verticalSpaceHeight;

    public VerticalSpaceItemDecorator(int verticalSpaceHeight) {

        this.verticalSpaceHeight = verticalSpaceHeight;
    }

    @Override
    public void getItemOffsets(Rect outRect,
                               View view,
                               RecyclerView parent,
                               RecyclerView.State state) {

        // 1. Determine whether to add a spacing decorator
        if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {

            // 2. Set the bottom offset to the specified height
            outRect.bottom = verticalSpaceHeight;
        }
    }
}

public class ShadowVerticalSpaceItemDecorator extends RecyclerView.ItemDecoration {

    private Drawable divider;

    public ShadowVerticalSpaceItemDecorator(Context context) {

        // Use the default style divider
        final TypedArray styledAttributes = context.obtainStyledAttributes(
                new int[] { android.R.attr.listDivider });
        this.divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    public ShadowVerticalSpaceItemDecorator(Context context, int resId) {

        // Use a custom divider specified by a drawable
        this.divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

        // 1. Get the parent (RecyclerView) padding
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        // 2. Iterate items of the RecyclerView
        for (int childIdx = 0; childIdx < parent.getChildCount(); childIdx++) {

            // 3. Get the item
            View item = parent.getChildAt(childIdx);

            // 4. Determine the item's top and bottom with the divider
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) item.getLayoutParams();
            int top = item.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();

            // 5. Set the divider's bounds
            this.divider.setBounds(left, top, right, bottom);

            // 6. Draw the divider
            this.divider.draw(c);
        }
    }
}

recyclerView项目的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"

    app:srcCompat="@mipmap/ic_launcher" />

<TextView
    android:id="@+id/textView_title"
    style="@style/AudioFileInfoOverlayText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/imageView"
    android:layout_alignLeft="@+id/imageView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignStart="@+id/imageView"
    android:layout_gravity="left"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:text="TextView"
    android:textColor="@android:color/white"
    android:textSize="22sp" />

<TextView
    android:id="@+id/textView_info"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/imageView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignStart="@+id/textView_title"
    android:layout_below="@+id/imageView"
    android:layout_marginTop="12dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:text="TextView" />

<Button
    android:id="@+id/button_one"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_below="@+id/textView_info"
    android:layout_marginBottom="5pt"
    android:layout_marginRight="5pt"
    android:background="@drawable/circle_button"
    android:text="One"
    android:textColor="@android:color/white" />

<Button
    android:id="@+id/button_two"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/imageView"
    android:layout_below="@+id/textView_info"
    android:layout_marginBottom="5pt"
    android:layout_marginLeft="5pt"
    android:background="@drawable/circle_button"
    android:backgroundTint="?android:attr/colorControlHighlight"
    android:text="Two"
    android:textColor="@android:color/white" />
</RelativeLayout>

</LinearLayout>

drop_shadow 代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size android:height="4dp" />
    <solid android:color="@color/darkGray" />
    <corners android:topLeftRadius="0dp" android:topRightRadius="0dp"
    android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp"/>
</shape>

边界:

<?xml version="1.0" encoding="UTF-8"?>

<stroke android:width="3dp"
    android:color="@color/gray"
    />

<padding android:left="1dp"
    android:top="1dp"
    android:right="1dp"
    android:bottom="1dp"
    />

<corners android:bottomRightRadius="7dp"
    android:bottomLeftRadius="7dp"
    android:topLeftRadius="7dp"
    android:topRightRadius="7dp"/>

【问题讨论】:

  • 发布您将在 recyclerView 中显示或绑定的内容布局
  • 能否请您更详细地编辑问题?
  • @ND1010_ 我相信我已经添加了您要求的内容,如果没有,我可以添加更多。
  • @ramanavv 还需要什么?如果你让我知道,我可以对帖子有更多需要。我想让我的项目带有边框,但看不到任何关于如何将其添加到我当前代码的文档或指南。
  • @FredWhite 您应用 VerticalSpaceItemDecorator、ShadowVerticalSpaceItemDecorator 和 RecyclerViewAdapter 的代码

标签: java android xml android-recyclerview


【解决方案1】:

在名为border.xml的Drawable文件夹上创建Xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <stroke android:color="@color/colorAccent" android:width="1dp"/>
    <corners android:radius="5dp" />
</shape>

然后改变RelativeLayout的背景

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/border"
        android:orientation="vertical">
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"

            app:srcCompat="@mipmap/ic_launcher" />

        <TextView
            android:id="@+id/textView_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/imageView"
            android:layout_alignLeft="@+id/imageView"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignStart="@+id/imageView"
            android:layout_gravity="left"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:text="TextView"
            android:textColor="@android:color/white"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/textView_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/imageView"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignStart="@+id/textView_title"
            android:layout_below="@+id/imageView"
            android:layout_marginTop="12dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:text="TextView" />

        <Button
            android:id="@+id/button_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/textView_info"
            android:layout_marginBottom="5pt"
            android:layout_marginRight="5pt"
            android:text="One"
            android:textColor="@android:color/white" />

        <Button
            android:id="@+id/button_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/imageView"
            android:layout_below="@+id/textView_info"
            android:layout_marginBottom="5pt"
            android:layout_marginLeft="5pt"
            android:backgroundTint="?android:attr/colorControlHighlight"
            android:text="Two"
            android:textColor="@android:color/white" />
    </RelativeLayout>

</LinearLayout>

如果你想加粗边框,那么&lt;stroke android:color="@color/colorAccent" android:width="5dp"/&gt;

【讨论】:

  • 谢谢,效果很好。现在唯一的问题是我的阴影超出了我添加的四舍五入。我已经为我的 drop_shadow 和边框 xml 文件添加了代码。要解决这个问题,我是否只需向投影添加填充?
  • @FredWhite 如果你得到你的答案,那么你应该标记我的答案,如果你没有问题,你应该标记我的答案:)
  • 为什么不简单地使用卡片视图,您可以根据需要进行自定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多