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;
}
}
}
}
Based on the code that connector published I came up with the following solution that supports different row / column sizes (though I have admittedly not tested that), takes the sizes of the item decorations into account and handles the different measure modes properly.
Here is the code:
If you set the below property, then all the cell will have fixed size: recyclerView.setHasFixedSize(true);
You'll need to add a custom GridlayoutManager. Check this https://gist.github.com/ArthurSav/5f80e19d9ba6d562fbd5