解决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());
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。