1. ホーム
  2. android

[解決済み] Androidでgridlayoutmanagerを使用してrecyclerviewの最後の要素の下にスペーシングを追加する

2022-12-07 03:59:27

質問

の最後の要素の行の下にスペースを追加しようとしています。 RecyclerViewGridLayoutManager . 私はカスタム ItemDecoration を使用し、その最後の要素では以下のようにボトムパディングを行います。

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 は、左のスペーシングに基づいて要素の高さを変更します。これを達成するための正しい方法は何ですか?

これは LinearLayoutManager . ただ GridLayoutManager はその問題があります。

がある場合に非常に便利です。 FAB があり、最後の行のアイテムが上にスクロールする必要がある場合に便利です。 FAB を表示する必要があります。

どのように解決するのですか?

この問題の解決策は、GridLayoutManagerのSpanSizeLookupをオーバーライドすることにあります。

RecylerViewを膨らませているActivityやFragmentでGridlayoutManagerを変更する必要があります。

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);
}