public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{
private final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable drawable;
public DividerGridItemDecoration(Context context){
TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
drawable = typedArray.getDrawable(0);
typedArray.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawHorizontal(parent,c);
drawVertical(parent,c);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
}
private void drawVertical(RecyclerView parent,Canvas canvas){
int childCount = parent.getChildCount();
for(int i=0;i<childCount;i++){
View view = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
int top = view.getTop() - params.topMargin;
int bottom = view.getBottom() + params.bottomMargin;
int left = view.getRight() + params.rightMargin;
int right = left + drawable.getIntrinsicWidth();
drawable.setBounds(left,top,right,bottom);
drawable.draw(canvas);
}
}
private void drawHorizontal(RecyclerView parent,Canvas canvas){
int childCount = parent.getChildCount();
for(int i=0;i<childCount;i++){
View view = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
int left = view.getLeft() - params.leftMargin;
int right = view.getRight() + params.rightMargin + drawable.getIntrinsicWidth();
int top = view.getBottom() + params.bottomMargin;
int bottom = top + drawable.getIntrinsicHeight();
drawable.setBounds(left,top,right,bottom);
drawable.draw(canvas);
}
}
private int getSpanCount(RecyclerView parent){
int spanCount = -1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if(layoutManager instanceof GridLayoutManager){
spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
}else if(layoutManager instanceof StaggeredGridLayoutManager){
spanCount = ((StaggeredGridLayoutManager)layoutManager).getSpanCount();
}
return spanCount;
}
private boolean isLastColum(RecyclerView parent,int spanCount,int position,int childCount){
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if(layoutManager instanceof GridLayoutManager){
if((position + 1)%spanCount == 0){
return true;
}
}else if(layoutManager instanceof StaggeredGridLayoutManager){
if(((StaggeredGridLayoutManager) layoutManager).getOrientation() == StaggeredGridLayoutManager.VERTICAL){
if((position+1)%spanCount == 0){
return true;
}
}else{
childCount = childCount - childCount%spanCount;
if(position >= childCount){
return true;
}
}
}
return false;
}
private boolean isLastRow(RecyclerView parent,int childCount,int position,int spanCount){
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if(layoutManager instanceof GridLayoutManager){
if(position >= (childCount - childCount%spanCount)){
return true;
}
}else if(layoutManager instanceof StaggeredGridLayoutManager){
if(((StaggeredGridLayoutManager) layoutManager).getOrientation() == StaggeredGridLayoutManager.VERTICAL){
if(position >= (childCount - childCount%spanCount)){
return true;
}
}else{
if((position + 1)%spanCount == 0){
return true;
}
}
}
return false;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
int position = parent.getChildAdapterPosition(view);
if(isLastColum(parent,spanCount,position,childCount)){
outRect.set(0,0,0,drawable.getIntrinsicHeight());
}else if(isLastRow(parent,childCount,position,spanCount)){
outRect.set(0,0,drawable.getIntrinsicWidth(),0);
}else{
outRect.set(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
}
}
}
自定义网格和瀑布流布局的分割线RecyclerView.ItemDecoration
最新推荐文章于 2021-03-15 15:08:52 发布
本文介绍了一个名为DividerGridItemDecoration的类,该类扩展了RecyclerView.ItemDecoration,用于实现自定义的网格和瀑布流布局的分割线。通过获取系统属性listDivider创建Drawable对象,并在onDraw方法中绘制水平和垂直分割线。类内部还包含了一些辅助方法,如检查是否为最后一列或最后一行,以避免在边界位置绘制分割线。

448

被折叠的 条评论
为什么被折叠?



