2016-03-01 39 views
1

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

我的装饰:

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

或者只有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); 
} 

c.drawline小号得到执行,只有当childCount大于1时,只是改变了,如果条件if(childCount >= 1)这应该修复这个问题。

这个答案ATLEAST解决您的问题的一个病还是继续找试图找到什么导致装修不上的最后一项显示,因为我想这行应的最后一个项目执行

c.drawLine(v.getX() + v.getPaddingLeft(), v.getY(), v.getX() + v.getPaddingLeft(), v.getY() - v.getHeight()/2, paint); 

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

编辑

我解决你的第二个问题也是如此,第2至最后一个参数传递给DrawLine的v.getY() - v.getHeight()/2你本质上借鉴视图的左上角开始行和视图(约v.getY() - v.getHeight()/2精确地)以上在某处结束它的油漆参数之前刚刚更改为v.getY() + v.getHeight()/2代替

这第二到最后一个参数之一,是float stopY,所以你要求行从视图的左上角开始,并在视图上方结束v.getY() - v.getHeight(),视图的边界之外,因此看不到该行。

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

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); 
+0

感谢aswering。 'childCount> 1'是正确的。它发生在列表只有1个项目时,因此,我只需要显示该圆圈,根本不需要线条。 – Leonardo

+0

你提到的那一行正在执行,我只是不知道它为什么不能正确绘图,我不知道它是否是一个误判问题......再次感谢 – Leonardo

+1

我也解决了你的第二个问题,你传递给drawline'v.getY() - v.getHeight()/ 2'的第二个到最后一个参数,你本质上是从视图的左上角开始绘制一条直线,并在视图上方的某个位置结束它(关于' v.getY() - v.getHeight()/ 2'),只需改变它为'v.getY()+ v.getHeight()/ 2'而不是 – Bhargav

相关问题