我正在使用RecyclerView.ItemDecoration类来创建列表中的分隔符,但是我想要隐藏列表中最后一个项目的分隔符。是否可以在不必自己实现分隔符的情况下实现这一点?
我正在使用RecyclerView.ItemDecoration类来创建列表中的分隔符,但是我想要隐藏列表中最后一个项目的分隔符。是否可以在不必自己实现分隔符的情况下实现这一点?
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public SimpleDividerItemDecoration(Context context) {
mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getAdapter().getItemCount();
for (int i = 0; i < childCount; i++) {
if (i == (childCount - 1)) {
continue;
}
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
line_divider.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="1dp"
android:height="1dp" />
<solid android:color="#F5F5F5" />
</shape>
childCount - 1
只会给你最后一个可见子视图的索引。正确的比较应该是: parent.getChildAdapterPosition(child) == parent.getAdapter().getItemCount() - 1
,就像 @Maxim Turaev 的答案所述。 - Stanislavparent.getChildCount()
会随着列表的填充而增长,因为它代表当前显示的项目数;因此,预期的最后一个项目的项装饰将在向下滚动列表并增加子计数时应用于每个项目。我建议对答案进行编辑,使用 getAdapter().getItemCount()
来解决问题。 - JHH尝试 Kotlin 版本,受 @Muthukrishnan Rajendran 启发
CommentDetailItemDecoration.kt
class CommentDetailItemDecoration(
context: Context
) : RecyclerView.ItemDecoration() {
val drawable: Drawable = ContextCompat.getDrawable(context, R.drawable.ft_item_divider)!!
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
val left = parent.paddingLeft
val right = parent.width - parent.paddingRight
val childCount = parent.adapter!!.itemCount
for (i in 0 until childCount - 1) {
val child = parent.getChildAt(i)
if (child != null) {
val params = child.layoutParams as RecyclerView.LayoutParams
val top = child.bottom + params.bottomMargin
val bottom = top + drawable.intrinsicHeight
drawable.setBounds(left, top, right, bottom)
drawable.draw(c)
}
}
}
}
ft_item_divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="1dp"
android:height="1dp" />
<solid android:color="@color/grey_97" />
</shape>
[更新]
您可以简单地复制或扩展DividerItemDecoration类,并通过修改其绘图行为来更改其内容
for (int i = 0; i < childCount; i++)
更改为 for (int i = 0; i < childCount - 1; i++)