I try to solve the following:
- using RecyclerView
 - with GridLayoutManager
 - with fixed cell-widths
 - recyclerview resizing only to the necessary height (wrap_content)
 
I try to use the following code, the problem is that it doesn't work, and I haven't found any working example not mentioning to redraw properly when orientation changes.
public class AutofitRecyclerView extends RecyclerView {
    private MyGridLayoutManager manager;
    private int columnWidth = -1;
    public AutofitRecyclerView(Context context) {
        super(context);
        init(context, null);
    }
    public AutofitRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }
    public AutofitRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }
    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            int[] attrsArray = {
                    android.R.attr.columnWidth
            };
            TypedArray array = context.obtainStyledAttributes(attrs, attrsArray);
            columnWidth = array.getDimensionPixelSize(0, -1);
            array.recycle();
        }
        manager = new MyGridLayoutManager(getContext(), 1);
        setLayoutManager(manager);
    }
    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        super.onMeasure(widthSpec, heightSpec);
        if (columnWidth > 0) {
            int mw = getMeasuredWidth();
            int spanCount = Math.max(1, mw / columnWidth);
            manager.setSpanCount(spanCount);
        }
        int numOfFullRows = manager.getItemCount() / manager.getSpanCount();
        if(manager.getItemCount() % manager.getSpanCount() > 0)
        {
            numOfFullRows++;
        }
        if(getChildCount() > 0) {
            int h = 0;
            try {
                h = manager.getChildAt(0).getMeasuredHeight();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(h != 0) {
                getLayoutParams().height = numOfFullRows * h;
            }
        }
    }
}