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:
Use StaggeredGridLayoutManager! https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager
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?"