源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-08-17 23:16 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Android 给RecyclerView添加分割线的具体步骤(分享)
【吐槽】RecyclerView没有提供分割线的方法,想要加个线还要自己画,点击事件的监听都要自己实现,不过真的好用。 [b]给RecyclerView添加分割线的步骤[/b] [b]1、新建类继承于RecyclerView.ItemDecoration,此为是抽象类:[/b]
  public static abstract class ItemDecoration {

  public void onDraw(Canvas c, RecyclerView parent, State state) {
    onDraw(c, parent);
  }

  public void onDrawOver(Canvas c, RecyclerView parent, State state) {
    onDrawOver(c, parent);
  }

  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
    getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
        parent);
  }

}
“onDraw和onDrawOver,显然,这两个方法是用于绘制的,那么绘制分割线的逻辑可以放在这里面,它们二者的具体区别是:onDraw是在item view绘制之前调用,而onDrawOver是在item view绘制之后调用,因此我们一般选择重写其中一个方法即可。getItemOffsets,这个方法是告诉RecyclerView在绘制完一个item view的时候,应该留下多少空位,以便于绘制分割线。” 好像逻辑也不难,但是真的好麻烦,比如我要给我的瀑布流布局加一条系统自带的分割线,系统自带的就行,那我要新建一个实现类:
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    //使用系统自带的listDivider
    private static final int[] ATTRS = new int[]{
        android.R.attr.listDivider
    };

    private Drawable mDivider;

    public DividerItemDecoration(Context context) {
      super();
      // 从TypedArray中得到一个Drawable对象
      final TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
      mDivider = typedArray.getDrawable(0);

      typedArray.recycle();
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
      super.onDraw(c, parent, state);
      drawDivider(c, parent);
    }

    /**
     * 遍历childView,为每一个childView描绘divider
     * @param c 画布对象
     * @param parent 父控件即RecyclerView
     */
    private void drawDivider(Canvas c, RecyclerView parent) {
      //获取分割线的上边距,即RecyclerView的padding值
      final int top = parent.getPaddingTop();

      //分割线下边距
      final int bottom = parent.getHeight() - parent.getPaddingBottom();

      final int childCount = parent.getChildCount();

      //遍历所有item view,为它们的右边方绘制分割线,就是计算出上下左右四个值画一个矩形
      for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
        final int left = child.getRight() + params.rightMargin;
        final int right = left + mDivider.getIntrinsicWidth();
        //画右边的divider
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);

        //画完右边画底边
        mDivider.setBounds(child.getLeft() + child.getPaddingLeft(), child.getBottom() + params.bottomMargin,
            child.getRight() - child.getPaddingRight(), child.getBottom() + mDivider.getIntrinsicHeight());
        mDivider.draw(c);
      }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
      super.getItemOffsets(outRect, view, parent, state);
      outRect.set(0, 0, mDivider.getIntrinsicHeight(), mDivider.getIntrinsicHeight());
    }
  }
[b]2、为RecyclerView添加写好的ItemDecoration即可[/b] mRecyclerView.addItemDecoration(new DividerItemDecoration(this)); [b]3、没有3。[/b] 其实从 RecyclerView.ItemDecoration 的名字就看得出来,它是RecyclerView的item的装饰品,也就是说,除了画分割线,想画什么都是可以的。 以上这篇Android 给RecyclerView添加分割线的具体步骤(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部