解决RecycleView分割线不居中的三种方法
本文为大家分享了三种RecycleView分割线不居中的解决方法,供大家参考,具体内容和如下
方法一:
publicclassSpacesItemDecorationextendsRecyclerView.ItemDecoration{ privateintmSpace; privateintmSpanCount;//RecyclerView有多少列 privatebooleanmHasPadding;//RecyclerView是否有Padding publicSpacesItemDecoration(intmSpace){ this.mSpace=mSpace; this.mHasPadding=true; } publicSpacesItemDecoration(intmSpace,booleanhasPadding){ this.mSpace=mSpace; this.mHasPadding=hasPadding; } @Override publicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,RecyclerView.Statestate){ //初始化列数 if(mSpanCount==0){ this.mSpanCount=((GridLayoutManager)parent.getLayoutManager()).getSpanCount(); } intposition=parent.getChildAdapterPosition(view);//itemposition intcolumn=position%mSpanCount;//itemcolumn if(mHasPadding){ outRect.left=mSpace-column*mSpace/mSpanCount;//spacing-column*((1f/spanCount)*spacing) outRect.right=(column+1)*mSpace/mSpanCount;//(column+1)*((1f/spanCount)*spacing) if(position<mSpanCount){//topedge outRect.top=mSpace; } outRect.bottom=mSpace;//itembottom }else{ outRect.left=column*mSpace/mSpanCount;//column*((1f/spanCount)*spacing) outRect.right=mSpace-(column+1)*mSpace/mSpanCount;//spacing-(column+1)*((1f/spanCount)*spacing) if(position>=mSpanCount){ outRect.top=mSpace;//itemtop } } } publicvoidsetHasPadding(booleanhasPadding){ this.mHasPadding=hasPadding; } }
方法二:
publicclassMutiItemDecorationextendsRecyclerView.ItemDecoration{ publicenumType{ VERTICAL,HORIZONTAL,ALL } privateTypetype;//分割线类型 privateintdividerSize=10;//分割线尺寸 publicMutiItemDecoration(MutiItemDecoration.Typetype,intdividerSize){ this.type=type; this.dividerSize=dividerSize; } @Override publicvoidgetItemOffsets(RectoutRect,intitemPosition,RecyclerViewparent){ intspanCount=getSpanCount(parent); intchildCount=parent.getAdapter().getItemCount(); switch(type){ caseALL: if(itemPosition%spanCount==0){//第一列 if(isLastRaw(parent,itemPosition,spanCount,childCount)){ outRect.set(0,0,dividerSize/2,0); }else{ outRect.set(0,0,dividerSize/2,dividerSize); } }elseif(itemPosition%spanCount==spanCount-1){//最后一列 if(isLastRaw(parent,itemPosition,spanCount,childCount)){ outRect.set(dividerSize/2,0,0,0); }else{ outRect.set(dividerSize/2,0,0,dividerSize); } }else{//中间列 if(isLastRaw(parent,itemPosition,spanCount,childCount)){ outRect.set(dividerSize/2,0,dividerSize/2,0); }else{ outRect.set(dividerSize/2,0,dividerSize/2,dividerSize); } } break; caseVERTICAL: if(isLastRaw(parent,itemPosition,spanCount,childCount)){ outRect.set(0,0,0,0); }else{ outRect.set(0,0,0,dividerSize); } break; caseHORIZONTAL: if(isLastColum(parent,itemPosition,spanCount,childCount)){ outRect.set(0,0,0,0); }else{ outRect.set(0,0,dividerSize,0); } break; } } //是否是最后一列 privatebooleanisLastColum(RecyclerViewparent,intpos,intspanCount,intchildCount){ RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ if((pos+1)%spanCount==0) returntrue; }else{ if(pos==childCount-1) returntrue; } returnfalse; } //是否是最后一行 privatebooleanisLastRaw(RecyclerViewparent,intpos,intspanCount,intchildCount){ RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ childCount=childCount-childCount%spanCount; if(pos>=childCount) returntrue; }else{ if(pos==childCount-1) returntrue; } returnfalse; } //返回列数 privateintgetSpanCount(RecyclerViewparent){ RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ return((GridLayoutManager)layoutManager).getSpanCount(); } return-1; } }
方法三:(目前只支持2列)
publicclassDividerGridItemDecorationextendsRecyclerView.ItemDecoration{ privatestaticfinalint[]ATTRS=newint[]{android.R.attr.listDivider}; privateDrawablemDivider; publicDividerGridItemDecoration(Contextcontext){ finalTypedArraya=context.obtainStyledAttributes(ATTRS); mDivider=ContextCompat.getDrawable(context,R.drawable.shape_divider); a.recycle(); } @Override publicvoidonDraw(Canvasc,RecyclerViewparent,RecyclerView.Statestate){ drawHorizontal(c,parent); drawVertical(c,parent); } privateintgetSpanCount(RecyclerViewparent){ //列数 intspanCount=-1; RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ spanCount=((GridLayoutManager)layoutManager).getSpanCount(); }elseif(layoutManagerinstanceofStaggeredGridLayoutManager){ spanCount=((StaggeredGridLayoutManager)layoutManager) .getSpanCount(); } returnspanCount; } publicvoiddrawHorizontal(Canvasc,RecyclerViewparent){ intchildCount=parent.getChildCount(); for(inti=0;i<childCount;i++){ finalViewchild=parent.getChildAt(i); finalRecyclerView.LayoutParamsparams=(RecyclerView.LayoutParams)child .getLayoutParams(); finalintleft=child.getLeft()-params.leftMargin; finalintright=child.getRight()+params.rightMargin +mDivider.getIntrinsicWidth(); finalinttop=child.getBottom()+params.bottomMargin; finalintbottom=top+mDivider.getIntrinsicHeight(); mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } } publicvoiddrawVertical(Canvasc,RecyclerViewparent){ finalintchildCount=parent.getChildCount(); for(inti=0;i<childCount;i++){ finalViewchild=parent.getChildAt(i); finalRecyclerView.LayoutParamsparams=(RecyclerView.LayoutParams)child .getLayoutParams(); if(i%2==1){ finalinttop=child.getTop()-params.topMargin; finalintbottom=child.getBottom()+params.bottomMargin; finalintleft=child.getLeft()-params.rightMargin; finalintright=left+mDivider.getIntrinsicWidth()/2; mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); }else{ finalinttop=child.getTop()-params.topMargin; finalintbottom=child.getBottom()+params.bottomMargin; finalintleft=child.getRight()+params.rightMargin; finalintright=left+mDivider.getIntrinsicWidth()/2; mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } finalinttop=child.getTop()-params.topMargin; finalintbottom=child.getBottom()+params.bottomMargin; finalintleft=child.getRight()+params.rightMargin; finalintright=left+mDivider.getIntrinsicWidth(); mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } } privatebooleanisLastColum(RecyclerViewparent,intpos,intspanCount, intchildCount){ RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ if((pos+1)%spanCount==0)//如果是最后一列,则不需要绘制右边 { returntrue; } }elseif(layoutManagerinstanceofStaggeredGridLayoutManager){ intorientation=((StaggeredGridLayoutManager)layoutManager) .getOrientation(); if(orientation==StaggeredGridLayoutManager.VERTICAL){ if((pos+1)%spanCount==0)//如果是最后一列,则不需要绘制右边 { returntrue; } }else{ childCount=childCount-childCount%spanCount; if(pos>=childCount)//如果是最后一列,则不需要绘制右边 returntrue; } } returnfalse; } privatebooleanisLastRaw(RecyclerViewparent,intpos,intspanCount, intchildCount){ RecyclerView.LayoutManagerlayoutManager=parent.getLayoutManager(); if(layoutManagerinstanceofGridLayoutManager){ childCount=childCount-childCount%spanCount; if(pos>=childCount)//如果是最后一行,则不需要绘制底部 returntrue; }elseif(layoutManagerinstanceofStaggeredGridLayoutManager){ intorientation=((StaggeredGridLayoutManager)layoutManager) .getOrientation(); //StaggeredGridLayoutManager且纵向滚动 if(orientation==StaggeredGridLayoutManager.VERTICAL){ childCount=childCount-childCount%spanCount; //如果是最后一行,则不需要绘制底部 if(pos>=childCount) returntrue; }else //StaggeredGridLayoutManager且横向滚动 { //如果是最后一行,则不需要绘制底部 if((pos+1)%spanCount==0){ returntrue; } } } returnfalse; } @Override publicvoidgetItemOffsets(RectoutRect,intitemPosition, RecyclerViewparent){ intspanCount=getSpanCount(parent); intchildCount=parent.getAdapter().getItemCount(); if(isLastRaw(parent,itemPosition,spanCount,childCount))//如果是最后一行,则不需要绘制底部 { outRect.set(0,0,mDivider.getIntrinsicWidth(),0); }elseif(isLastColum(parent,itemPosition,spanCount,childCount))//如果是最后一列,则不需要绘制右边 { outRect.set(0,0,0,mDivider.getIntrinsicHeight()); }else{ outRect.set(0,0,mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。