Skip to content Skip to sidebar Skip to footer

How To Make Gridlayoutmanager Use Dynamic Spaces?

I am currently using a GridLayoutManager for a RecyclerView which displays Previews of different Articles, which have different text lengths and therefor different item heights. Th

Solution 1:

Solution 2:

Try to set your layout manager like this for recyclerview.

adapter = newCustomAdapter(R.layout.layout, list, context);
finalStaggeredGridLayoutManagerlayoutManager=newStaggeredGridLayoutManager(numberOfrows, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView_sk.setHasFixedSize(true);
recyclerView_sk.addItemDecoration(newSpacesItemDecorationNew(0));//For equal distribution of columns.
recyclerView_sk.setLayoutManager(layoutManager);
recyclerView_sk.setAdapter(adapter);

SpacesItemDecorationNew

publicclassSpacesItemDecorationNewextendsRecyclerView.ItemDecoration {

    privateint mItemOffset;

    publicSpacesItemDecorationNew(int itemOffset) {
        mItemOffset = itemOffset;
    }

    publicSpacesItemDecorationNew(@NonNull Context context, @DimenResint itemOffsetId) {
        this(context.getResources().getDimensionPixelSize(itemOffsetId));
    }

    @OverridepublicvoidgetItemOffsets(Rect outRect, View view, RecyclerView parent,
                               RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset);
    }
}

Solution 3:

Also, you can try with this

        mDashboardAdapter = newDashboardAdapter(getActivity(), mDashBoardList, imageId);
        RecyclerView.LayoutManagermLayoutManager=newGridLayoutManager(getActivity(), 4);
        grid.setLayoutManager(mLayoutManager);
        grid.addItemDecoration(newGridSpacingItemDecoration(4, 10, true));
        grid.setItemAnimator(newDefaultItemAnimator());
        grid.setAdapter(mDashboardAdapter);



    publicstaticclassGridSpacingItemDecorationextendsRecyclerView.ItemDecoration {

        privateint spanCount;
        privateint spacing;
        privateboolean includeEdge;

        publicGridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
            this.spanCount = spanCount;
            this.spacing = spacing;
            this.includeEdge = includeEdge;
        }

        @OverridepublicvoidgetItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            intposition= parent.getChildAdapterPosition(view); // item positionintcolumn= position % spanCount; // item columnif (includeEdge) {
                outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
                outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)if (position < spanCount) { // top edge
                    outRect.top = spacing;
                }
                outRect.bottom = spacing; // item bottom
            } else {
                outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
                outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)if (position >= spanCount) {
                    outRect.top = spacing; // item top
                }
            }
        }
    }

Post a Comment for "How To Make Gridlayoutmanager Use Dynamic Spaces?"