消除 RecyclerView 中第一项顶部的分隔符
eliminate divider on top of the first item in the RecyclerView
我有一个RecyclerView
,上面有一个header(即标题,一个描述RecyclerView
内容的TextView
)
现在我通过一些逻辑将两个不同的ViewHolders组合到Adapter中来获得这个效果,但是我得到了意想不到的结果。
recyclerView 有分隔线,但是 我想在 TextView
和 `RecyclerView 的第一个项目之间删除一行:
换句话说,我只需要消除 RecyclerView
的顶部分隔线,
第一项,因为我希望顶部的 TextView 和下面的列表之间没有分隔,而我希望其他项在我获得时分开
此 展示了如何消除 RV 的最后一行分隔符,但我需要第一行,但我不知道如何根据我的用例调整此代码段,或者我是否应该创建一个新的 class.
在 RecyclerView.ItemDecoration
中我想识别 RecyclerView
中的第一个视图而不是为其绘制装饰。我也不想为装饰保留任何 space,因为它没有被绘制。这需要覆盖 getItemOffsets()
。
下面是一些代码,它对除第一个和最后一个之外的所有 RecyclerView
项的底部应用装饰。
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecorator(Drawable divider) {
mDivider = divider;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int pos = parent.getChildAdapterPosition(view);
if (pos != 0 &&
pos != parent.getLayoutManager().getItemCount() - 1) {
outRect.bottom = mDivider.getIntrinsicHeight();
}
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
int pos = parent.getChildAdapterPosition(child);
if (pos != 0 &&
pos != parent.getLayoutManager().getItemCount() - 1) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
}
这是它的样子。我夸大了分隔线,以便它们脱颖而出。
我有一个RecyclerView
,上面有一个header(即标题,一个描述RecyclerView
内容的TextView
)
现在我通过一些逻辑将两个不同的ViewHolders组合到Adapter中来获得这个效果,但是我得到了意想不到的结果。
recyclerView 有分隔线,但是 我想在 TextView
和 `RecyclerView 的第一个项目之间删除一行:
换句话说,我只需要消除 RecyclerView
的顶部分隔线,
第一项,因为我希望顶部的 TextView 和下面的列表之间没有分隔,而我希望其他项在我获得时分开
此
在 RecyclerView.ItemDecoration
中我想识别 RecyclerView
中的第一个视图而不是为其绘制装饰。我也不想为装饰保留任何 space,因为它没有被绘制。这需要覆盖 getItemOffsets()
。
下面是一些代码,它对除第一个和最后一个之外的所有 RecyclerView
项的底部应用装饰。
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecorator(Drawable divider) {
mDivider = divider;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int pos = parent.getChildAdapterPosition(view);
if (pos != 0 &&
pos != parent.getLayoutManager().getItemCount() - 1) {
outRect.bottom = mDivider.getIntrinsicHeight();
}
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
int pos = parent.getChildAdapterPosition(child);
if (pos != 0 &&
pos != parent.getLayoutManager().getItemCount() - 1) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
}
这是它的样子。我夸大了分隔线,以便它们脱颖而出。