single/grid/staggedgrid with variable columns
public class StaggedGridItemDecoration extends RecyclerView.ItemDecoration {
    private int padding;
    private int gridSize;
    public StaggedGridItemDecoration(Context context, int dimenMarginResource, int gridSize) {
        padding = context.getResources().getDimensionPixelSize(dimenMarginResource);
        this.gridSize = gridSize;
    }
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams)view .getLayoutParams();
        int column = lp.getSpanIndex();
        if( gridSize == 1){
            // colonna singola
            outRect.top    = 0;
            outRect.bottom = padding;
            outRect.left   = 0;
            outRect.right  = 0;
            return;
        }
        if( column == 0 ){
            // prima colonna
            outRect.top    = 0;
            outRect.bottom = padding;
            outRect.left   = 0;
            outRect.right  = padding/2;
        }else if( column != gridSize-1){
            // colonne in mezzo
            outRect.top    = 0;
            outRect.bottom = padding;
            outRect.left   = padding/2;
            outRect.right  = padding/2;
        }else{
            // ultima colonna
            outRect.top    = 0;
            outRect.bottom = padding;
            outRect.left   = padding/2;
            outRect.right  = 0;
        }
    }
}