id使用gridlayoutmanager在recyclervi

id使用gridlayoutmanager在recyclervi

本文介绍了Android使用gridlayoutmanager在recyclerview中的最后一个元素下方添加间距的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用GridLayoutManagerRecyclerView的最后一个元素行下方添加间距.为此,我使用了自定义ItemDecoration并在其最后一个元素如下时使用了底部填充:

I am trying to add spacing below the last element row in RecyclerView with GridLayoutManager. I used custom ItemDecoration for this purpose with bottom padding when its last element as follows:

public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private int space;
private int bottomSpace = 0;

public SpaceItemDecoration(int space, int bottomSpace) {
    this.space = space;
    this.bottomSpace = bottomSpace;
}

public SpaceItemDecoration(int space) {
    this.space = space;
    this.bottomSpace = 0;
}

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

    int childCount = parent.getChildCount();
    final int itemPosition = parent.getChildAdapterPosition(view);
    final int itemCount = state.getItemCount();

    outRect.left = space;
    outRect.right = space;
    outRect.bottom = space;
    outRect.top = space;

    if (itemCount > 0 && itemPosition == itemCount - 1) {
        outRect.bottom = bottomSpace;
    }
}
}

但是此方法的问题在于,它弄乱了最后一行网格中的元素高度.我猜想GridLayoutManager会根据剩余间距更改元素的高度.实现此目的的正确方法是什么?

But the problem with this method is that it messed up the element heights in the grid in last row. I am guessing that GridLayoutManager changes the heights for elements based on spacing left. What is the correct way to achieve this?

这对于LinearLayoutManager将正常工作.只是在GridLayoutManager有问题的情况下.

This will work correctly for a LinearLayoutManager. Just in case of a GridLayoutManager its problematic.

如果底部有FAB并且需要最后一行的项目滚动到FAB上方以便可见,则该功能非常有用.

Its very useful in case you have a FAB in bottom and need items in last row to scroll above FAB so that they can be visible.

推荐答案

此问题的解决方案在于重写GridLayoutManager的SpanSizeLookup.

The solution to this problem lies in overrinding the SpanSizeLookup of GridLayoutManager.

您必须在对RecylerView进行放大的Activity或Fragment中更改GridlayoutManager.

You have to make changes to the GridlayoutManager in the Activity or Fragment where you are inflating the RecylerView.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //your code
    recyclerView.addItemDecoration(new PhotoGridMarginDecoration(context));

    // SPAN_COUNT is the number of columns in the Grid View
    GridLayoutManager gridLayoutManager = new GridLayoutManager(context, SPAN_COUNT);

    // With the help of this method you can set span for every type of view
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            if (list.get(position).getType() == TYPE_HEADER) {
                // Will consume the whole width
                return gridLayoutManager.getSpanCount();
            } else if (list.get(position).getType() == TYPE_CONTENT) {
                // will consume only one part of the SPAN_COUNT
                return 1;
            } else if(list.get(position).getType() == TYPE_FOOTER) {
                // Will consume the whole width
                // Will take care of spaces to be left,
                // if the number of views in a row is not equal to 4
                return gridLayoutManager.getSpanCount();
            }
            return gridLayoutManager.getSpanCount();
        }
    });
    recyclerView.setLayoutManager(gridLayoutManager);
}

这篇关于Android使用gridlayoutmanager在recyclerview中的最后一个元素下方添加间距的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 22:58