我在我的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;
}
这是渲染:
现在我想改变每个项目装饰器的颜色。这意味着例如用红色改变第二项的蓝色。这就是我期望的:
有没有办法使用RecyclerView.ItemDecoration在每个项目的基础上更改装饰颜色?
答案 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,并从那里将项目更新为所需的颜色。