RecyclerView如何消除底部的分割线
程序员文章站
2021-11-28 11:21:08
...
最近遇到一个问题、用RecyclerView显示数据、纵向列表显示、添加默认分割线、问题是:底部也会显示分割线、这很影响美观、怎么解决这个问题呢?我想了很多办法、毫无头绪
最后、查看默认分割线的类DividerItemDecoration的源码
public class DividerItemDecoration extends ItemDecoration { private static final int[] ATTRS = new int[]{16843284}; public static final int HORIZONTAL_LIST = 0; public static final int VERTICAL_LIST = 1; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { TypedArray a = context.obtainStyledAttributes(ATTRS); this.mDivider = a.getDrawable(0); a.recycle(); this.setOrientation(orientation); } public void setOrientation(int orientation) { if(orientation != 0 && orientation != 1) { throw new IllegalArgumentException("invalid orientation"); } else { this.mOrientation = orientation; } } public void onDraw(Canvas c, RecyclerView parent) { if(this.mOrientation == 1) { this.drawVertical(c, parent); } else { this.drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for(int i = 0; i < childCount; i) { View child = parent.getChildAt(i); LayoutParams params = (LayoutParams)child.getLayoutParams(); int top = child.getBottom() params.bottomMargin; int bottom = top this.mDivider.getIntrinsicHeight(); this.mDivider.setBounds(left, top, right, bottom); this.mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { int top = parent.getPaddingTop(); int bottom = parent.getHeight() - parent.getPaddingBottom(); int childCount = parent.getChildCount(); for(int i = 0; i < childCount; i) { View child = parent.getChildAt(i); LayoutParams params = (LayoutParams)child.getLayoutParams(); int left = child.getRight() params.rightMargin; int right = left this.mDivider.getIntrinsicHeight(); this.mDivider.setBounds(left, top, right, bottom); this.mDivider.draw(c); } } public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if(this.mOrientation == 1) { outRect.set(0, 0, 0, this.mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, this.mDivider.getIntrinsicWidth(), 0); } } }
因为我用到的是垂直列表、用到的是下面的代码
public void drawVertical(Canvas c, RecyclerView parent) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for(int i = 0; i < childCount; i) { View child = parent.getChildAt(i); LayoutParams params = (LayoutParams)child.getLayoutParams(); int top = child.getBottom() params.bottomMargin; int bottom = top this.mDivider.getIntrinsicHeight(); this.mDivider.setBounds(left, top, right, bottom); this.mDivider.draw(c); } }
从代码中很容易看出只要修改for循环中的内容就可去掉底部的分割线:
public void drawVertical(Canvas c, RecyclerView parent) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for(int i = 0; i < childCount-1; i) { View child = parent.getChildAt(i); LayoutParams params = (LayoutParams)child.getLayoutParams(); int top = child.getBottom() params.bottomMargin; int bottom = top this.mDivider.getIntrinsicHeight(); this.mDivider.setBounds(left, top, right, bottom); this.mDivider.draw(c); } }
因为这个类我们不能直接修改、所以我们可以自定义一个类、修改相应内容
添加分割线的时候、使用自定义类、大功告成