RecyclerView消除底部分割线的方法

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

  }

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

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

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

(0)

相关推荐

  • Android RecyclerView实现水平、垂直方向分割线

    android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现RecyclerView的水平/垂直分割线,则需要继承自RecyclerView.ItemDecoration重写getItemOffsets方法,从而增加水平/垂直分割线. 写一个例子. MainActivity.Java: package zhangphil.app; import android.content.Context; import android.graphics.Col

  • android中RecyclerView自定义分割线实现

    最近一直在看RecyclerView,较之ListView它确实是灵活多变,给予开发者更多自定义的空间,比如:需要添加头部和尾部.item的点击事件.自定义的LayoutManager,还有就是下面要说的自定义的分割线. 1.如何理解分割线 经常听到有人说自定义分割线麻烦,为什么不把分割线写到item布局里,这样不是更简单吗?有些情况把分割线写到item布局里是很难达到我们想要的效果,例如RecyclerView里的GridLayoutManager,StaggeredGridLayoutMan

  • Android RecyclerView网格布局(支持多种分割线)详解(2)

    上篇Android RecyclerView 详解(1)-线性布局 记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽. 这篇是总结一下网格布局的使用,同样也支持两种分割线和线宽的设置. 主要的相关类: 1. RecyclerView.Adapter 2. GridLayoutManager 网格布局管理器 3. RecycleView.ItemDecoration 分割线 下面就直接通过

  • Android实现RecyclerView添加分割线的简便方法

    1.前言 刚开始学习RecyclerView的时候我跟着一个视频学的,当时添加分割线是从外面导入一个Java类,然后使用里面的函数来创建分割线的,所以一直以来我都是这样做的.直到前几天才无意中发现,原来v7包中提供了一个DividerItemDecoration类,利用它,我们可以很简单地实现RecyclerView的分割线!那还等什么呢?赶紧用起来. 2.创建一个简单的RecyclerView 首先当然应该来一个RecyclerView,这里就不再赘述了,随便造点数据就好.直接上代码: pub

  • 万能RecyclerView分割线

    就不多叙述了,直接上代码 import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import andr

  • RecyclerView的万能分割线

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

  • Android中RecyclerView上拉下拉,分割线,多条目的实例代码

    //activity的xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity

  • Android 给RecyclerView添加分割线的具体步骤(分享)

    [吐槽]RecyclerView没有提供分割线的方法,想要加个线还要自己画,点击事件的监听都要自己实现,不过真的好用. 给RecyclerView添加分割线的步骤 1.新建类继承于RecyclerView.ItemDecoration,此为是抽象类: public static abstract class ItemDecoration { public void onDraw(Canvas c, RecyclerView parent, State state) { onDraw(c, par

  • RecyclerView底部分割线去除的方法

    概述 之前我们抛出了一个问题就是RecyclerView在显示列表的时候,最底部也就是最后一个Item后面还有分割线,这大大影响界面的美观.这篇文章就是解决这个问题的. 自定义分割线 通过分析源码后我们发现没有相关的方法来处理这一需求,所以只能自定义分割线,通过上一篇文章的基础我们知道肯定是修改getItemOffsets.那我们的思路是让这个方法在到最后一个条目时,不偏移分割线的间隙.同时也要修改onDraw方法,让他不再绘制最后一条分割线. private void drawHorizont

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

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

  • JavaScript实现自动消除按钮功能的方法

    本文实例讲述了JavaScript实现自动消除按钮功能的方法.分享给大家供大家参考.具体如下: 这里使用JavaScript自动消除前项显示的内容,在网页特定方位显示内容,第一个按钮可用,但第二个在第一个点击之后就不能用了,如果想让第二个按钮起作用,你需要对其进行功能消除,如本示例代码就实现这样一种功能. 运行效果如下图所示: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

  • 令按钮悬浮在(手机)页面底部的实现方法

    如下所示: $("#phone-buy-div-id").css("bottom",0); $("#phone-buy-div-id").css("position","fixed"); 以上这篇令按钮悬浮在(手机)页面底部的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Android编程简单设置ListView分割线的方法

    本文实例讲述了Android编程简单设置ListView分割线的方法.分享给大家供大家参考,具体如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ListView android

  • 关于Bootstrap按钮组件消除黄框的方法

    bootstrap的button边框问题 最近在线上学习bootstrap时,发现很多童鞋都会遇到很多坑,有些很容易掉进去就出不来了: bootstrap框架在国内相对来说还是非常热的,毕竟上手快速,代码简洁,在日常开发中可是能省不少事呢,但是吧,刚入bootstrap的童鞋,对bootstrap的样式源码等不熟悉,框架有些默认的样式虽然很漂亮,但是无奈童鞋们的胃口太挑剔,比如本人就喜欢折腾,为了让样式看起来萌萌哒,不惜时间,对它动手动脚的: 对于如何使用bootstrap,网上可是又不少教程的

  • 详解微信小程序设置底部导航栏目方法

    详解微信小程序设置底部导航栏目方法 小程序底部想要有一个漂亮的导航栏目,不知道怎么制作,于是百度找到了本篇文章,分享给大家. 好了 小程序的头部标题 设置好了,我们来说说底部导航栏是如何实现的. 我们先来看个效果图 这里,我们添加了三个导航图标,因为我们有三个页面,小程序最多能加5个. 那他们是怎么出现怎么着色的呢?两步就搞定! 1. 图标准备 阿里图标库  http://www.iconfont.cn/collections/show/29 我们进入该网站,鼠标滑到一个喜欢的图标上面  点击下

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

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

  • Android开发实现消除屏幕锁的方法

    本文实例讲述了Android开发实现消除屏幕锁的方法.分享给大家供大家参考,具体如下: 实现屏幕无锁--->当我们开机或者超过锁屏幕时间或按电源键之后屏幕没有锁的一种状态. 经过查询许多资料以及分析代码,我们可以发现最主要的屏幕功能还是在framework/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java中. 里面有一个handleshow方法: 真正的去锁屏实现有一个 handlehide方法,

  • 用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法

    如下所示: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <script type="text/javascript"> funct

随机推荐