RecycleView GridLayoutManager 分割线

先po出效果图:

效果如上所示  就是为了达到效果(每行间有分割线 最后一排没有分割线)

至于为什么不用 gridview。可能有点脑抽吧 ,以后可能会添加功能 如果填满了呢?(哎就是这样自我安慰)

完成这任务主要是在 dividerItemDecoration类里面 重写 ondrawover方法。

1:在fragment或者activity里 给recycleview 设置manager和decoration(自定义)

 if (mGridLayoutManager == null) {
            mGridLayoutManager = new GridLayoutManager(getContext(), 4, LinearLayoutManager.VERTICAL, false);
        }
 if (mDividerItemDecoration == null) {
          mDividerItemDecoration = new GridItemDividerDecoration(getResources().getDrawable(R.drawable.divider_underline),GridItemDividerDecoration.VERTICAL,1);}
  mRv.addItemDecoration(mDividerItemDecoration);  mRv.setLayoutManager(mGridLayoutManager);

2自定义GridItemDividerDecoration

/*给gridRecycleView 实现分割线  tip:建议recycleview的长宽模式设为wrapcontent divider的作用主要提供颜色和默认边框值  均可自己设置
* */
public class GridItemDividerDecoration extends RecyclerView.ItemDecoration {
    private  int mRedundant;
    public static  final  int VERTICAL =1;
    public static final int Horizon =0;
    private  Drawable mDivider;
    private int mThickness;
    private int mOratation;

    public GridItemDividerDecoration(Drawable divider, int orantation) {
        this.mDivider =divider;
        this.mOratation =orantation;
        setThickness();
    }

    public GridItemDividerDecoration(Drawable divider, int orantation,int thick) {//亲测横向纵向都可以的
        this.mDivider =divider;
        this.mOratation =orantation;
        setThickness(thick);
    }

    private void setThickness(){
        if (mOratation==VERTICAL){
           mThickness= mDivider.getIntrinsicHeight();
        }else if (mOratation==Horizon){
          mThickness=mDivider.getIntrinsicWidth();
        }
    }

    private void setThickness(int thickness){//用于自己设置分割线宽度
       mThickness = thickness;
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
       int spancount= ((GridLayoutManager)parent.getLayoutManager()).getSpanCount();
        mRedundant = parent.getChildCount()%spancount;
        mRedundant = mRedundant==0?spancount:mRedundant;//最后一排的item个数
        final int underlineNum = parent.getChildCount()-mRedundant;//下划线的child的个数
        final Drawable divider = mDivider;
        final int thickness = mThickness;
        for (int i = 0;i<underlineNum;i++) {//给非最后一排的item画边边
            View child = parent.getChildAt(i);
            if (mOratation == VERTICAL) {
                divider.setBounds(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom() + thickness);
            }
            if (mOratation == Horizon) {
                divider.setBounds(child.getRight(),child.getTop(), child.getRight() + thickness, child.getBottom());
            }
            divider.draw(c);
        }

    }
}

记一下: setBounds(left,top,right,bottom)参数是要画的东西的绝对位置.

另外:学会了一个获取child的position的方法

int iPos = ((RecyclerView.LayoutParams) recycleview.getLayoutParams()).getViewLayoutPosition();
				
时间: 2024-10-27 19:42:14

RecycleView GridLayoutManager 分割线的相关文章

RecycleView设置顶部分割线(记录一个坑)

大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration 项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给RecycleView设置分割线的方法,当然只给第一个Item设置,而且在上方. public class MyDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; /** * Custo

ListView分割线,RecycleView分割线

Recycleview分割线需要自己定义,默认是没有的.代码如下 package com.ipd.east.eastapplication.adapter; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import

android recycleView 简单使用二---分割线

转自:https://www.jianshu.com/p/b46a4ff7c10a RecyclerView没有像之前ListView提供divider属性,而是提供了方法 recyclerView.addItemDecoration() 其中ItemDecoration需要我们自己去定制重写,一开始可能有人会觉得麻烦不好用,最后你会发现这种可插拔设计不仅好用,而且功能强大. ItemDecoration类主要是三个方法: public void onDraw(Canvas c, Recycle

Android RecycleView使用详解

一.RecycleView简要介绍 RecycleView是support-v7包中的新组件,是一个强大的滑动组件.相比于ListView和GridView具有很多让开发者喜欢的优点,如:数据绑定,Item的创建和View的回收复用机制等.但RecycleView更加高级灵活,当我们数据因为用户事件或者网络事件发生改变的时候也能很好的进行显示.RecycleView最主要的特点就是复用. 二.RecycleView与ListView区别 RecycleView是ListView的升级版,与经典的

个人记录之RecycleView的具体实现(简单实现)

RecycleView的设计模式是观察者模式,这个以后再深究. recycleview有三种布局(1)瀑布流StaggeredGridLayoutManager(2)GridLayoutManager(3)Layoutmanager.他们 都有横纵滑动的功能 具体实现: @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setCont

灵活性比Listview更好的RecycleView

RecycleView:是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好. RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集.相同点:1.item的排列方式:两种布局管理器: LinearLayoutManager GridLayoutManager 2.操作item的时候提供默认的动画效果3.item多种布局比较方便4.封装了item的优化5.适配器不同不同点:1.分割线

嗯嗯,一句代码就搞定 RecycleView 侧滑菜单、添加头部底部、加载更多

很早就萌生了将这种方案封装为一个开源库的想法,旨在实现调用方式最简单,且又不失可定制性.本库最大的特点的是采用了 Glide 简洁明了的链式调用方式,一句代码即可添加侧滑菜单.头部底部等. 特性: 1.自定义侧滑菜单布局 2.添加头部.底部 3.轻松实现加载更多 4.设置 item 间距 5.多种 item 类型 6.支持 LinearLayout 及 GridLayout 7.一句代码实现所有功能 效果: 左侧滑菜单.右侧滑菜单.自定义菜单布局:      头部.多头部:      底部.多底

Android开发RecycleView的使用全解

RecycleView 简介: RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出. 优点及作用: 根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下: RecylerView封装了viewholder的回收复用,也就是说

recycleview

why recycleview ?  是ListView的更高度定制版,当你需要高效的展示大量数据时候,动态改变列表样式的时候,就用这个. 当然,如果只是动态展示数据,listview也可以做到,用它替代listview的原因有几个: 简介中提到的它封装了viewholder的回收复用. RecyclerView使用布局管理器管理子view的位置(目前尚只提供了LinearLayoutManager),你能够使用复杂的布局来展示一个列表 ,再不用拘泥于ListView的线性展示方式,如果之后提供