RecyclerView消除底部分割线的方法_Android

最近遇到一个问题,用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);
    }

  }

因为这个类我们不能直接修改,所以我们可以自定义一个类,修改相应内容,

添加分割线的时候,使用自定义类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索消除分割线方法
recyclerview 分割线、recyclerview的分割线、recyclerview加分割线、xrecyclerview 分割线、recyclerview滑到底部,以便于您获取更多的相关知识。

时间: 2024-12-31 21:05:07

RecyclerView消除底部分割线的方法_Android的相关文章

RecyclerView消除底部分割线的方法

最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线. 问题是:底部也会显示分割线,这很影响美观. 怎么解决这个问题呢?我想了很多办法,毫无头绪... 最后,查看默认分割线的类DividerItemDecoration的源码: public class DividerItemDecoration extends ItemDecoration { private static final int[] ATTRS = new int[]{16843284}; publi

Android 关于ExpandableListView去掉里头分割线的方法_Android

关于ExpandableListView, 自己写了个类继承自BaseExpandableListAdapter groups,childs 都弄好了,显示出来的效果跟网上很多demo一样,我现在就是想去掉那个组下面各item间的分割线 有知道的么? ------解决方案-------------------- expandableList.setDivider(null); up,还不行就设置一个透明的颜色. ------解决方案-------------------- 可以的, androi

RecyclerView的万能分割线_Android

什么是RecyclerView RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView.Palette等.看名字我们就能看出一点端倪,没错,它主要的特点就是复用.我们知道,Listview中的Adapter中可以实现ViewHolder的复用.RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView.GridView以及瀑布流的效果. 先给大家展示下效果图: 使用方法: 添

ListView实现顶部和底部内容指示器的方法_Android

顶部指示器? 这是什么? 好吧,我承认这是我自己想出来的词,因为我不知道它有什么学名,究竟是什么呢?看下这个图就知道了. 这是我们的美工MM画的,偶的神呐,这虽然很漂亮,不过也让人头疼,这个箭头应该在滚到顶部的时候消失,滚下来的时候(即有条目隐藏的时候)才显示,类似的底部指示器也要有这样的效果.事实上默认的ListView和ScrollView都已经有了类似的效果,在顶部或底部还有更多内容时,会有部分渐变虚化的效果,不过美工已经设计了这样的效果,那么我们就来做吧. 出于省事的目的,本教程中的例子

RecyclerView实现常见的列表菜单_Android

在很多地方我们都会用到纵向列表样式的菜单,比如微信首页的我.发现页面,微博的首页的我页面,QQ的动态页面等等等等,大多数的应用中都会存在这样的页面.我们怎样实现这种页面比较好呢? 布局方案 完成这样的页面,常见的布局方案有: 1. 用ScrollView+LinearLayout很容易的暴力布局出来,但是这样得到的布局太固定了,如果条目多一点,加载起来很耗时. 2. 用ListView来实现,这种方案比方案一要好上不少,起码数据多点的时候,加载时不会太耗时.但是分割线和中间空白在要求差异化的时候

RecyclerView的万能分割线

什么是RecyclerView RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView.Palette等.看名字我们就能看出一点端倪,没错,它主要的特点就是复用.我们知道,Listview中的Adapter中可以实现ViewHolder的复用.RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView.GridView以及瀑布流的效果. 先给大家展示下效果图: 使用方法: 添

在Word中巧妙绘制漂亮分割线的方法

  在Word中巧妙绘制漂亮分割线的方法          1.添加下框线 如果要在Word文档的段落之间添加分割线,可先选中整个段落或段落的最后一行,然后在"开始"选项卡的"段落"选项组中,单击[边框和底纹]的下三角按钮,在随即打开的下拉列表中,执行[下框线]命令,即可在段落下方添加一条分割线,如图1所示. 图1 添加下框线 也可以在"边框和底纹"下拉列表中执行[边框和低纹]命令,然后在打开的"边框和底纹"对话框中,根据个人

JavaScript中消除闭包的一般方法介绍

 这篇文章主要介绍了JavaScript中消除闭包的一般方法介绍,本文直接给出了操作示例,需要的朋友可以参考下     JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量

脚本-chrome全屏播放视频时如何消除底部系统自带的控制条

问题描述 chrome全屏播放视频时如何消除底部系统自带的控制条 用chrome播放视频全屏时,底部总是会弹出自带的控制条,脚本里用controls来控制也不行,这该如何解决? 解决方案 https://www.zhihu.com/question/33594879/answer/57730822