ItemDecoration未在最后一个单元格上绘制

时间:2016-03-01 18:22:41

标签: android

我写了一个小片段,在RecyclerView的每个项目中显示一条垂直线和一个小球。 但是最后一个或只有1个项目永远不会被绘制。

我的装饰:

public class MarkerDecoration extends RecyclerView.ItemDecoration {

    Paint paint;

    public MarkerDecoration() {
        paint = new Paint();
        paint.setColor(Color.parseColor("#cccccc"));
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; i++) {
            View v = parent.getChildAt(i);
            c.save();

            if (childCount > 1) {
                if (i == 0)
                    c.drawLine(v.getX() + v.getPaddingLeft(), v.getHeight() / 2 - v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight(), paint);
                else if (i == childCount - 1)
                    c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getY() - v.getHeight() / 2, paint);
                else
                    c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight() + v.getY(), paint);
            }

            c.drawCircle(v.getX() + v.getPaddingLeft(), v.getY() - v.getHeight() / 2, 8, paint);
            c.restore();
        }
    }
}

它正在调用的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="32dp"
    android:paddingEnd="@dimen/line_item_paddings"
    android:paddingLeft="@dimen/line_item_text_padding"
    android:paddingRight="@dimen/line_item_paddings">


    <TextView
        android:id="@+id/post_date_row"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerInParent="true"
        android:paddingEnd="@dimen/line_item_text_padding"
        android:paddingLeft="@dimen/line_item_text_padding"
        android:paddingRight="@dimen/line_item_text_padding"
        android:paddingStart="@dimen/line_item_text_padding"
        android:text="3 JUL"
        android:textColor="@color/light_gray" />

    <TextView
        android:id="@+id/title_row"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_toEndOf="@+id/post_date_row"
        android:layout_toLeftOf="@+id/amount_row"
        android:layout_toRightOf="@+id/post_date_row"
        android:layout_toStartOf="@+id/amount_row"
        android:ellipsize="end"
        android:maxLines="1"
        android:paddingEnd="@dimen/line_item_text_padding"
        android:paddingLeft="@dimen/line_item_text_padding"
        android:paddingRight="@dimen/line_item_text_padding"
        android:text="GTX Telecom" />

    <TextView
        android:id="@+id/amount_row"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerInParent="true"
        android:paddingEnd="@dimen/line_item_text_padding"
        android:paddingLeft="@dimen/line_item_text_padding"
        android:paddingRight="@dimen/line_item_text_padding"
        android:text="54,00" />

</RelativeLayout>

我在这里缺少什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

或只有1件物品永远不会被画出来。

从装饰类的代码

中查看此代码段
FLUSHALL

仅当childCount大于1时才执行if (childCount > 1) { if (i == 0) c.drawLine(v.getX() + v.getPaddingLeft(), v.getHeight() / 2 - v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight(), paint); else if (i == childCount - 1) c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getY() - v.getHeight() / 2, paint); else c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getHeight() + v.getY(), paint); } ,只需将if条件更改为c.drawline即可解决此问题。

这个答案至少解决了你的问题之一仍然一直试图找到什么导致装饰没有显示在最后一项上,对于最后一项我想这行应该执行

if(childCount >= 1)

但我不知道它究竟是什么错误

修改

我也解决了你的第二个问题,你传递给画线c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getY() - v.getHeight() / 2, paint); 的倒数第二个参数你实际上是从视图的左上角开始绘制一条直线,并在视图上方的某个位置结束它(约{完全{1}}只需将其更改为v.getY() - v.getHeight() / 2而不是

这个第二个到最后一个参数是paint参数之前的一个,是float stopY,所以你要求行从视图的左上角开始并在视图上方结束v.getY() - v.getHeight()/2,这超出了这个视图的界限和因此无法看到这条线。

所以你的固定代码看起来像这样

v.getY() + v.getHeight()/2