recyclerview多布局 decoration

发布时间:2021-08-05| 信息来源:干建明

3实现Item的带颜色分割线的效果LinearManager下的实现上述基本实现了item分割的效果但是它没有办法设置颜色要实现颜色首先我

3实现Item的带颜色分割线的效果LinearManager下的实现上述基本实现了item分割的效果但是它没有办法设置颜色要实现颜色首先我

.背景RecyclerView是谷歌V7包下新增的控件,用来替代ListView和GridView使用的一个控件。在使用的过程中,往往需要使用到divider的效果(item之间的分割线)。而RecyclerView并不像ListView一样自带有divider的属性。而是需要用到这样一个类,但是ItemDecoration是一个抽象类,而且android内部并没有给它做一些效果的实现。那么就需要我们自己去继承并实现其中的方法,本文讲述的就是在GridLayoutManager和LinearLayoutManager下如何去实现ItemDecoration。至于的具体分析,大家可以去看看这篇文章深入理解RecyclerView系列之一:ItemDecoration这里不作过多的阐述。

2.实现基本的Item的创建SpacesItemDecoration创建一个类SpacesItemDecoration继承于,实现其中的onDraw和getItemOffsets方法,在这里我们的设计是左右距离相等,上下距离相等。

{privateintleftRight;privateinttopBottom;publicSpacesItemDecoration(intleftRight,inttopBottom){=leftRight;=topBottom;}OverridepublicvoidonDraw(Canvasc,RecyclerViewparent,){(c,parent,state);}OverridepublicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,){}}在这里我们主要实现的方法是onDraw和getItemOffsets,getItemOffsets主要是确定divider的范围,而onDraw是对divider的具体实现。

下divider的实现首先在getItemOffsets方法中需要判断当前的RecyclerView所采用的哪种LayoutManager。这里要注意的是GridLayoutManager是继承LinearLayoutManager的,所以需要先判断是否为GridLayoutManager。

privateSpacesItemDecorationEntrustgetEntrust(){SpacesItemDecorationEntrustentrust=null;//要注意这边的GridLayoutManager是继承LinearLayoutManager,所以要先判断GridLayoutManagerif(managerinstanceofGridLayoutManager){entrust=newGridEntrust(leftRight,topBottom,mColor);}else{//其他的都当做Linear来进行计算entrust=newLinearEntrust(leftRight,topBottom,mColor);}returnentrust;}然后我们来看具体的实现,首先判断是VERTICAL还是HORIZONTAL。对于VERTICAL,每一个item必需的是top,left和right,但是最后一个item还需要bottom。而对于HORIZONTAL,每一个item必需的是top,left和bottom,但是最后一个item还需要right。

OverridepublicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,){LinearLayoutManagerlayoutManager=(LinearLayoutManager)();//竖直方向的if(()==){//最后一项需要bottomif((view)==()-1){=topBottom;}=topBottom;=leftRight;=leftRight;}else{//最后一项需要rightif((view)==()-1){=leftRight;}=topBottom;=leftRight;=topBottom;}}就这样,divider效果就实现了(当然是没有任何的颜色的)。调用方式只需要。

intleftRight=dip2px(7);inttopBottom=dip2px(7);rv_(newSpacesItemDecoration(leftRight,topBottom));VERTICAL

下divider的实现对于GridLayoutManager下的实现,相比LinearLayoutManager要复杂一些。首先当然是判断VERTICAL还是HORIZONTAL。一般来说有三种情况的,如图所示:

样式.png由于第二种布局样式考虑的情况比较多,目前没有找到比较好的方法去进行判断,所以在这里只对另外两种布局样式进行考虑

OverridepublicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,){GridLayoutManagerlayoutManager=(GridLayoutManager)();=()();finalintchildPosition=(view);finalintspanCount=();if(()==){//判断是否在第一排if(().getSpanGroupIndex(childPosition,spanCount)==0){//第一排的需要上面=topBottom;}=topBottom;//这里忽略和合并项的问题,只考虑占满和单一的问题if(()==spanCount){//占满=leftRight;=leftRight;}else{=(int)(((float)(()))/spanCountleftRight);=(int)(((float)leftRight(spanCount1)/spanCount)-);}}else{if(().getSpanGroupIndex(childPosition,spanCount)==0){//第一排的需要=leftRight;}=leftRight;//这里忽略和合并项的问题,只考虑占满和单一的问题if(()==spanCount){//占满=topBottom;=topBottom;}else{=(int)(((float)(()))/spanCounttopBottom);=(int)(((float)topBottom(spanCount1)/spanCount)-);}}}在这里,对于VERTICAL下,每个item需要的是bottom,然后第一排需要top,同时在这里使用了GridLayoutManager的一个方法().getSpanGroupIndex(childPosition,spanCount)该方法可以用于判断item在布局中所处于的行数。因为这里的outRect的值会一起统计到每个item的宽高之中。为了保证每个item的大小一致,所以这里的每个item的left和right的和必须保持一致,具体的计算方法如下:

计算方式.png这样,GridLayoutManager的效果就实现了,调用方法跟LinearLayoutManager下是一样的。效果如下

VERTICAL

HORIZONTAL3.实现Item的带颜色分割线的效果下的实现上述基本实现了item分割的效果,但是它没有办法设置颜色。要实现颜色,首先我们得传入一个颜色色值。

//color的传入方式是;publicSpacesItemDecorationEntrust(intleftRight,inttopBottom,intmColor){=leftRight;=topBottom;if(mColor!=0){mDivider=newColorDrawable(mColor);}}有了颜色,那么我们就需要去重写onDraw方法了,我们需要去确定绘制的区域。先贴上代码

OverridepublicvoidonDraw(Canvasc,RecyclerViewparent,){LinearLayoutManagerlayoutManager=(LinearLayoutManager)();//没有子view或者没有没有颜色直接returnif(mDivider==null||()==0){return;}intleft;intright;inttop;intbottom;finalintchildCount=();if(()==){for(inti=0;iRecyclerView的机制是去绘制要显示在屏幕中的View,而没有显示出来的是不会去绘制。所以这边需要使用的是()而不是()。对于LinearManager下来说,需要绘制分割线的区域是两个item之间,这里分为VERTICAL和HORIZONTAL。我们拿VERTICAL来进行分析,首先获取item以及它的LayoutParams,在这里计算floatcenter=((child)-topBottom)/2;因为一个RecyclerView可以添加多个ItemDecoration,而且方法的调用顺序是先实现所有ItemDecoration的getItemOffsets方法,然后再去实现onDraw方法。目前没有找到办法去解决每个ItemDecoration的具体区域。所以退而求其次的将分割线绘制在所有ItemDecoration的中间区域(基本能满足一般的需求,当然可以自己修改位置满足自己的需求)。然后我们要去确定绘制的区域,left就是所有ItemDecoration的宽度,right就是parent的宽度减去所有ItemDecoration的宽度。top是child的底部位置然后还要加上center(center的目的是绘制在中间区域),bottom就是top加上需要绘制的高度。同理在HORIZONTAL模式下可以类似的实现。使用一个ItemDecoration的效果

intleftRight=dip2px(2);inttopBottom=dip2px(2);rv_(newSpacesItemDecoration(leftRight,topBottom,getResources().getColor()));VERTICAL

HORIZONTAL当然你也可以使用多个ItemDecoration

intleftRight=dip2px(10);inttopBottom=dip2px(10);rv_(newSpacesItemDecoration(leftRight,topBottom));rv_(newSpacesItemDecoration(dip2px(2),dip2px(2),getResources().getColor()));VERTICAL

下的实现GridManager下的实现的步骤类似与LinearManager,不同的是确定绘制分割线的区域。它的分割线的区域是相邻的item之间都需要有分割线。废话不多说,先上代码。

OverridepublicvoidonDraw(Canvasc,RecyclerViewparent,){finalGridLayoutManagerlayoutManager=(GridLayoutManager)();=();if(mDivider==null||()==0){return;}//判断总的数量是否可以整除intspanCount=();intleft,right,top,bottom;finalintchildCount=();if(()==){for(inti=0;i我们就VERTICAL的情况下来进行分析,首先横向的分割线,只需要在最左侧的item绘制出来的时候进行分割线的绘制就行了。当然最后一排是不需要的。

if(!isFirstright=()-(child);top=(int)(()-centerTop)-topBottom;bottom=toptopBottom;(left,top,right,bottom);(c);}水平的分割线的计算方式类似与LinearLayoutManager下的计算方式。这里不过多阐述。而竖直方向的会有一些区别。由于GridLayoutManager下,item的数量不一定能够刚好整除每排的数量。所以这边的绘制区域是根据每个item来进行确定的。能被整除的或者当数量不足的时候最后一项不需要竖直的分割线。同时要注意补齐centerTop(分割线绘制在中间区域的位置)。

//最右边的一排不需要右边的booleanisRight=spanIndexspanSize==spanCount;if(!isRight){//计算右边的left=(int)(()centerLeft);right=leftleftRight;top=();if(!isFirst){top-=centerTop;}bottom=(int)(()centerTop);(left,top,right,bottom);(c);}HORIZONTAL下的情况可以进行类似的分析,代码的调用方式跟LinearLayoutManager下是一样的。

AndroidRecyclerView实现悬浮吸顶分隔线到底提示效果本文中所有效果通过ItemDecoration实现通过此实现的可以与业务解耦让RecyclerView的模板

3实现Item的带颜色分割线的效果LinearManager下的实现上述基本实现了item分割的效果但是它没有办法设置颜色颜色颜色重要的

自定义分割线设置drawable

HORIZONTAL4最后至此,RecyclerView的divider效果已经基本实现了。当然,你可以在这基础上进行修改,尤其是GridLayoutManager情况下比较复杂,可以根据实际的布局进行对应的修改,满足自己的一些需求。欢迎大家一起相互交流。代码已经上传https:///hzl123456/SpacesItemDecoration(ps:在实际的使用过程中,当对RecyclerView的item进行增加和删除的操作是,会使ItemDecoration的分割区域计算错误。原因是在添加和删除操作的时候,只会计算更新的部分区域的OutRect,导致出现问题,这个时候我们只需要在添加和删除操作之后调用RecyclerView的invalidateItemDecorations()方法就可以解决问题了)

3具体代码实现由于RecyclerView的布局方式多种多样所以它的分割线也根据布局的不同有所

decoration recyclerview多布局 recyclerview原理 recyclerview不显示 recyclerview使用 横向recyclerview recyclerviewtag 两个recyclerview viewonlyitem
  • 最美设计 幼儿园设计最美效果图人

    博苑2017-2018年博苑设计首先进入南京市浦口区华美路幼儿园微信公众号打开投票页面

    12-15

  • 光栅尺原理 光栅尺的工作原理

    常见光栅的工作原理都是根据物理上莫尔条纹的形成原理进行工作的。当使指示光栅上的线纹与标尺光栅上的线纹成一角度来放置两光栅尺时,必然会造成两光栅尺上的线纹互相交义。在光源的照射下,交叉点近旁的小区域内由于黑色线纹重叠,因而遮光面积最小,挡光效应最弱,光的累积作用使得这个区

    12-08

  • 去痘护肤 什么护肤品祛痘效果好 十

    咱们中国人,皮肤相对老外细腻,老外是爱长斑,咱们中国人爱长痘,长痘以后就怕留下痘印和痘疤,所以首选你长痘不要扣,然后就是选择正确的护肤品,坚持用,过了青春期,等内分泌等协调了以后,痘痘自然就少了。今天我们就给大家推荐好用祛痘产品,都是良心推荐,经过大众认可的。宝拉珍选2%水杨酸焕采精华

    11-28

  • 葡萄籽胶囊 女性长期吃葡萄籽胶囊

    大家好,我是回头鱼老牛,每天为大家提供专业有价值的健康知识是我的乐趣,老牛也希望您能从中获得益处,收获健康!今天想跟大家聊聊葡萄籽胶囊的话题。因此葡萄籽胶囊常吃对身体无害但是需要注意的是葡萄籽中含有一定量的类激素物质类

    11-18

  • 影视墙效果图 电视背景墙装修效果

    影视墙俗称电视背景墙,就是指客厅中最引人注目的一面墙,一般是放置电视、音响。因客厅是家人以及会客的主要场所,所以影视墙的装修在客厅装饰乃至室内整体装潢中占据很重要的一部分。设计师通过对装饰材料的运用,使普通的白墙达到美观实用的目的,并采用各种手段来突出主人的个性特点。随

    10-15

  • 棉织物 知识 棉织物煮炼和漂白的

    棉织物煮炼的原理和目的直接输入

    09-19

  • 电视剧上错花轿嫁对郎 经典电视剧

    有的时候一些阴差阳错的故事往往会造就一个非常浪漫动人的爱情故事,很多电视剧就是这样所发生的。在最开始总是有非常多的巧合让男主和女主见面,在他们见面之后发现其实非常喜欢对方,那么这样的感情慢慢的就出现了,然后就上演了非常美好的爱情故事。所以在这部电视剧当中,确实也是非常好

    09-07

  • 何鸿燊 何鸿燊灵柩转移东华义庄该

    何鸿燊离世,结束了自己传奇的一生,享年98岁。去世一个多月后,何鸿燊的葬礼于7月8日、9日、10日举行3天,首日葬礼只让至亲告别,9日是何鸿燊生前好友吊唁,10日举行大殓仪式,之后,赌王的灵柩一直暂放于殡仪馆内,择日移至东华义庄,预计要等到明年,择吉日再安葬在何家家族墓园摩星岭的昭远坟场。这

    09-03

  • 凤凰资讯 小獾每日资讯炉石凤凰年

    炉石传说削弱回调。炉石传说在3月18日对曾经部分遭到削弱的卡牌进行了回调,其中就包括了宇宙牧核心卡拉兹以及快乐的代表尤格萨隆。本次共有10张卡牌回调。回调卡牌一览后你将在第一次登录时自动获得奥术之尘补偿

    08-24

  • decoration 自定义RecyclerViewIte

    .背景RecyclerView是谷歌V7包下新增的控件,用来替代ListView和GridView使用的一个控件。在使用的过程中,往往需要使用到divider的效果(item之间的分割线)。而RecyclerView并不像ListView一样自带有divider的属性。而是需要用到这样一个类,但是ItemDecoration是一个抽象类,而且android内

    08-05

  • 推荐阅读
    热门点击

    友情链接

    邮箱

    手机版||十八大新闻网 Inc.

    , Processed in 0.204694 second(s), 9 queries.

    Powered by十八大新闻网

    © 2001-2020十八大新闻网 Inc.