gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:31:15 25 4
gpt4 key购买 nike

我写了一个小 fragment 来在 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>

我在这里缺少什么?

谢谢!

最佳答案

or when there is 1 item only is never getting drawn.

看看装饰类代码中的这个 fragment

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 条件更改为 if(childCount >= 1) 即可解决此问题问题。

这个答案至少解决了你的一个问题我仍然继续寻找导致装饰不显示在最后一项上的原因,对于最后一项我认为应该执行这一行

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

但是我不知道到底是哪里出了问题

编辑

我也解决了你的第二个问题,你传递给 drawline 的倒数第二个参数 v.getY() - v.getHeight()/2 你实际上是从左上角开始画一条线 View 的一角并在 View 上方的某处结束它(关于 v.getY() - v.getHeight()/2 准确)只需将其更改为 v.getY() + v .getHeight()/2 而不是

倒数第二个参数,也就是 paint 参数之前的那个,是 float stopY 所以你要求线从 View 的左上角开始并结束 v.getY() - v.getHeight() 在 View 上方,超出此 View 的范围,因此看不到该行。

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

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

关于android - ItemDecoration 未在最后一个单元格上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35730482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com