每个项目更改RecyclerView.ItemDecoration颜色

时间:2017-03-26 19:11:12

标签: android android-recyclerview

我在我的recyclerview上使用自定义项装饰器,它运行正常。

MyItemDecorationTest.java

public class MyItemDecorationTest extends RecyclerView.ItemDecoration{

    private Paint paint;
    private final static int OFFSET = 8;

    public MyItemDecorationTest(Paint paint){
        this.paint = paint;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.set(OFFSET, OFFSET, OFFSET, OFFSET);
    }

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

        final RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

        for(int i=0; i<parent.getChildCount(); i++){
            final View child = parent.getChildAt(i);
            c.drawRoundRect(layoutManager.getDecoratedLeft(child) + OFFSET,
                    layoutManager.getDecoratedTop(child) + OFFSET,
                    layoutManager.getDecoratedRight(child) - OFFSET,
                    layoutManager.getDecoratedBottom(child) - OFFSET, 2, 2, paint);
        }
    }
}

这就是我将其包含在我的活动中的方式:

RecyclerView.ItemDecoration itemDecoration = new MyItemDecorationTest(getPaint(getResources().getColor(R.color.block_blue)));
recyclerView.addItemDecoration(itemDecoration);

这是我设置油漆的方法。

public Paint getPaint(int color){
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(color);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(4);

    return paint;
}

这是渲染:

item decoration example

现在我想改变每个项目装饰器的颜色。这意味着例如用红色改变第二项的蓝色。这就是我期望的:

desire state

有没有办法使用RecyclerView.ItemDecoration在每个项目的基础上更改装饰颜色?

3 个答案:

答案 0 :(得分:1)

您应该考虑直接在布局中绘制边框并在运行时更改布局的颜色,而不是使用ItemDecoration来更改项目的颜色。

你可以这样做:

<强> corner.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <stroke
        android:width="2dp"
        android:color="#07AFF2" />

    <solid android:color="#ffffff" />

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

    <corners android:radius="3dp" />
</shape>

将其添加到您的drawable文件夹中。您的layout.xml文件应如下所示:

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

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textView"
            android:textColor="@color/colorBlack"
            android:gravity="center_vertical"
            android:layout_gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Element" />

    </LinearLayout>
</LinearLayout>

答案 1 :(得分:1)

我的解决方法是:

  • 覆盖getItemViewType(int position)以返回不同的视图类型,
  • 为不同的视图类型提供不同的布局,
  • 覆盖onCreateViewHolder(@NonNull ViewGroup parent, int viewType),以膨胀不同的布局,
  • 提供不同颜色的可绘制对象
  • 将所有可绘制对象传递到其构造函数中的ItemDecoration
  • 覆盖onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state)以为每种视图类型选择正确的可绘制对象。

My example with different colors

我也尝试过以编程方式更改颜色,但是看起来不起作用...

答案 2 :(得分:0)

来自您的RecyclerView适配器&#39; onBindViewHolder&#39;方法,您可以将当前项目位置传递给Viewholder,并从那里将项目更新为所需的颜色。