我尝试解决以下问题:
- 使用 RecyclerView
- 使用 GridLayoutManager
- 具有固定单元格宽度
- recyclerview 仅调整到必要的高度(wrap_content)
我尝试使用以下代码,问题是它不起作用,而且我还没有找到任何工作示例,没有提到在方向改变时正确重绘。
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;
}
}
}
}