0
  • 全部等分的话我觉得在我发给你的类的基础上设置最外层布局为math_parent就可以了


    1290102301154942976  评论     打赏       CH-Android
    • 其实你可以看一下RecyclerView.ItemDecoration这个类的源码,它是一个抽象类,你自己写一个类去继承它,然后重写他的onDraw方法,(你可以参考一下DividerItemDecoration这个类是怎么写的),你在重写onDraw方法的时候你是是持有RecyclerView这个父View的,你可以通过 parent.getChildCount()来获取到itemView,这样你就有itemView的宽和高

      final int childCount = parent.getChildCount();
      for (int i = 0; i < childCount; i++) {
          final View child = parent.getChildAt(i);
          parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds);
          final int right = mBounds.right + Math.round(child.getTranslationX());
          final int left = right - mDivider.getIntrinsicWidth();
          mDivider.setBounds(left, top, right, bottom);
          mDivider.draw(canvas);
      }
      
      


      就上面一样,这样你可以以定制自己的想要的itemView排放位置

      1298536191469150208  评论     打赏       dajiba009
      • 1336679443158130688  评论     打赏       以梦为马
        • 1336679443158130688  评论     打赏       以梦为马
          • 用我写的这个类吧:

            package com.ianlon.uphoto.ui.view;
            
            import android.graphics.Canvas;
            import android.graphics.Color;
            import android.graphics.Paint;
            import android.graphics.Rect;
            import android.support.annotation.ColorInt;
            import android.support.v7.widget.GridLayoutManager;
            import android.support.v7.widget.RecyclerView;
            import android.support.v7.widget.StaggeredGridLayoutManager;
            import android.view.View;
            
            public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
            
                private Paint mPaint;
                private int mDividerWidth,mDividerHeight;
            
                public SpaceItemDecoration(int height) {
                    mDividerWidth = height;
                    mDividerHeight = height;
                    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                    mPaint.setColor(Color.TRANSPARENT);
                    mPaint.setStyle(Paint.Style.FILL);
                }
            
                public SpaceItemDecoration(int height, @ColorInt int color) {
                    mDividerWidth = height;
                    mDividerHeight = height;
                    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                    mPaint.setColor(color);
                    mPaint.setStyle(Paint.Style.FILL);
                }
            
                public SpaceItemDecoration(int width, int height, @ColorInt int color) {
                    mDividerWidth = width;
                    mDividerHeight = height;
                    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                    mPaint.setColor(color);
                    mPaint.setStyle(Paint.Style.FILL);
                }
            
                @Override
                public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                    super.getItemOffsets(outRect, view, parent, state);
                    int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
                    int spanCount = getSpanCount(parent);
                    int childCount = parent.getAdapter().getItemCount();
            
                    boolean isLastRow = isLastRow(parent, itemPosition, spanCount, childCount);
            
                    int top = 0;
                    int left;
                    int right;
                    int bottom;
                    int eachWidth = (spanCount - 1) * mDividerWidth / spanCount;
                    int dl = mDividerWidth - eachWidth;
            
                    left = itemPosition % spanCount * dl;
                    right = eachWidth - left;
                    bottom = mDividerHeight;
                    if (isLastRow){
                        bottom = 0;
                    }
                    outRect.set(left, top, right, bottom);
            
                }
            
                @Override
                public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
                    super.onDraw(c, parent, state);
                    draw(c, parent);
                }
            
                //绘制item分割线
                private void draw(Canvas canvas, RecyclerView parent) {
                    int childCount = parent.getChildCount();
                    for (int i = 0; i < childCount; i++) {
                        View child = parent.getChildAt(i);
                        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                        boolean isLastRow = isLastRow(parent, i, getSpanCount(parent), childCount);
                        //画水平分隔线
                        int left = child.getLeft();
                        int right = child.getRight();
                        int top = child.getBottom() + layoutParams.bottomMargin;
                        int bottom = top + mDividerHeight;
                        if (isLastRow)  bottom = top;
                        if (mPaint != null) {
                            canvas.drawRect(left, top, right, bottom, mPaint);
                        }
                        //画垂直分割线
                        top = child.getTop();
                        bottom = child.getBottom() + mDividerHeight;
                        left = child.getRight() + layoutParams.rightMargin;
                        right = left + mDividerWidth;
                        if (isLastRow)  bottom = child.getBottom();
                        if (mPaint != null) {
                            canvas.drawRect(left, top, right, bottom, mPaint);
                        }
                    }
                }
            
                private boolean isLastColumn(RecyclerView parent, int pos, int spanCount,
                                             int childCount) {
                    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
                    if (layoutManager instanceof GridLayoutManager) {
                        if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边
                            return true;
                        }
                    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                        int orientation = ((StaggeredGridLayoutManager) layoutManager)
                                .getOrientation();
                        if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                            if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
                            {
                                return true;
                            }
                        } else {
                            childCount = childCount - childCount % spanCount;
                            if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
                                return true;
                        }
                    }
                    return false;
                }
            
                private boolean isLastRow(RecyclerView parent, int pos, int spanCount,
                                          int childCount) {
                    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
                    if (layoutManager instanceof GridLayoutManager) {
                        int lines = childCount % spanCount == 0 ? childCount / spanCount : childCount / spanCount + 1;
                        return lines == pos / spanCount + 1;
                    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                        int orientation = ((StaggeredGridLayoutManager) layoutManager)
                                .getOrientation();
                        // StaggeredGridLayoutManager 且纵向滚动
                        if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                            childCount = childCount - childCount % spanCount;
                            // 如果是最后一行,则不需要绘制底部
                            if (pos >= childCount)
                                return true;
                        } else {
                            // 如果是最后一行,则不需要绘制底部
                            if ((pos + 1) % spanCount == 0) {
                                return true;
                            }
                        }
                    }
                    return false;
                }
            
                private boolean isFirstRow(RecyclerView parent, int pos, int spanCount,
                                           int childCount) {
                    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
                    if (layoutManager instanceof GridLayoutManager) {
                        if ((pos / spanCount + 1) == 1) {
                            return true;
                        } else {
                            return false;
                        }
                    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                        int orientation = ((StaggeredGridLayoutManager) layoutManager)
                                .getOrientation();
                        // StaggeredGridLayoutManager 且纵向滚动
                        if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                            childCount = childCount - childCount % spanCount;
                            // 如果是最后一行,则不需要绘制底部
                            if (pos >= childCount)
                                return true;
                        } else {
                            // 如果是最后一行,则不需要绘制底部
                            if ((pos + 1) % spanCount == 0) {
                                return true;
                            }
                        }
                    }
                    return false;
                }
            
                //获取列数
                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;
                }
            
            }
            


            1290102301154942976  评论     打赏       CH-Android
            • 以梦为马  回复 @CH-Android
              非常感谢您的分享我用了您的类,布局依然处于偏移的状态,麻烦您有时间可以帮忙看一下 万分感谢
              以梦为马 2021-02-02 09:02   回复 1336679443158130688
            • 以梦为马  回复 @CH-Android
              因为无法回复图片, 我把代码发在您的评论下面
              以梦为马 2021-02-02 09:03   回复 1336679443158130688
          相关问题
          珂珂范范 · recycleview
          2019-12-18 19:52 1418 2
          你我山间自相逢 · RecycleViewBase
          2020-08-15 03:23 397 2
          我可能进了假群 · Viewbinding / RecycleView
          2021-08-27 04:51 300 12
          王卓Sco · recycleView
          2022-05-24 09:10 185 5
          deanhu · AOSP
          2024-04-25 21:53 2 10
          幻影~ · 提问
          2024-04-13 20:13 10 2
          幻影~ · 找工作
          2024-04-07 10:44 16 2
          幻影~ · 问题
          2024-03-31 17:20 7 2
          TONYGFX · AOSP
          2024-03-28 17:11 4 2