简体   繁体   English

RecyclerVIew 中使用 GridLayoutManger 的装饰间距和跨度

[英]Decoration spacing and span with GridLayoutManger in RecyclerVIew

I am trying to implement this kind of RecyclerView by using GridLayoutMangaer as its layout.我正在尝试通过使用 GridLayoutMangaer 作为其布局来实现这种 RecyclerView。 However, I am facing the issue while implementing the item spacing for each item in the grid.但是,我在为网格中的每个项目实现项目间距时遇到了这个问题。

My aim is to have an implementation like image below我的目标是实现如下图所示

Please click on this link to preview image请点击此链接预览图片

Any solutions for this kind of implementation would be appreciated对于这种实现的任何解决方案将不胜感激

        public class GridRec extends RecyclerView.ItemDecoration {
          private int space;
        
          public GridRec(int space) {
            this.space = space;
          }
        
          @Override
          public void getItemOffsets(Rect outRect, View view, 
              RecyclerView parent, RecyclerView.State state) {
            outRect.left = space;
            outRect.right = space;
            outRect.bottom = space;
        
            if (parent.getChildLayoutPosition(view) == 0) {
                outRect.top = space;
            } else {
                outRect.top = 0;
            }
          }
        }
        
        
        int my_space = getResources().getDimension(R.dimen.test);
        myRecyclerView.addItemDecoration(new GridRec(my_space));
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    -----------------------------------------------------------
    
 


public class abc extends RecyclerView.ItemDecoration {

    private int myPadding_psx;
    private int myPadding_edge_psx;

    public abc(Activity activity) {
        final Resources resources = activity.getResources();
        myPadding_psx = (int) resources.getDimension(R.dimen.myDefault);
        myPadding_edge_psx = (int) resources.getDimension(R.dimen.mYDefaultEdge);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == RecyclerView.NO_POSITION) {
            return;
        }
        int orientation = getOrientation(parent);
        final int itemCount = state.getItemCount();

        int left = 0;
        int top = 0;
        int right = 0;
        int bottom = 0;

        //Horizontal
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            left = myPadding_psx;
            right =myPadding_psx;

            if (itemPosition == 0) {
                left += myPadding_edge_psx;
            }

            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                right += myPadding_edge_psx;
            }
        }

        //Vertical
        else {
            top = myPadding_psx;
            bottom = myPadding_psx;

            if (itemPosition == 0) {
                top += myPadding_edge_psx;
            }
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                bottom += myPadding_edge_psx;
            }
        }

        if (!isReverseLayout(parent)) {
            outRect.set(left, top, right, bottom);
        } else {
            outRect.set(right, bottom, left, top);
        }
    }

    private boolean isReverseLayout(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getReverseLayout();
        } else {
            throw new IllegalStateException("Error.");
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException("Error.");
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM