RecyclerView如何消除底部的分割线
2017-05-09 13:05:39 By: shinyuu
最近遇到一个问题、用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); } }
因为这个类我们不能直接修改、所以我们可以自定义一个类、修改相应内容
添加分割线的时候、使用自定义类、大功告成
若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力
想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)
或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)
如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教
为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)
感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛