This is how to achieve equal spacing between grid elements and RecyclerView borders. Applicable for both GridLayoutManager and StaggeredGridLayoutManager. No modification of existing Adapter is required.
The simple trick is to combine RecyclerView.ItemDecoration and RecyclerView paddings:
// initialise RecyclerView
final RecyclerView recyclerView = findViewById(R.id.recycler_view);
final GridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(new Adapter(this));
final int spacing = getResources().getDimensionPixelSize(R.dimen.recycler_spacing) / 2;
// apply spacing
recyclerView.setPadding(spacing, spacing, spacing, spacing);
recyclerView.setClipToPadding(false);
recyclerView.setClipChildren(false);
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.set(spacing, spacing, spacing, spacing);
}
});
In the snippet above we are dividing desired spacing by two. We need this because we are applying half of the spacing to each element and RecyclerView borders. This way all items will be surrounded by equal spacing.