package com.loop_anime.android.ui.layout; import android.content.Context; import android.content.res.TypedArray; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import com.loop_anime.android.utils.MathUtils; /** * User: Yilun Chen * Date: 15/10/15 */ @SuppressWarnings("unused") public class AutoFitRecyclerView extends RecyclerView { private int columnWidth; private GridLayoutManager manager; private int mSpanCount = 1; private boolean hasHeader = false; private GridLayoutManager.SpanSizeLookup gridLayoutManager; private int maxColumnCount; 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, android.R.attr.columnCount }; TypedArray array = context.obtainStyledAttributes( attrs, attrsArray); columnWidth = array.getDimensionPixelSize(0, -1); maxColumnCount = array.getInt(1, 999); array.recycle(); } manager = new GridLayoutManager(getContext(), 1); setLayoutManager(manager); this.gridLayoutManager = new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (position == 0) { return mSpanCount; } return 1; } }; } public int getSpanCount() { return mSpanCount; } public void setHasHeader(boolean hasHeader) { this.hasHeader = hasHeader; } @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); if (columnWidth > 0) { mSpanCount = MathUtils.constrains(getMeasuredWidth() / columnWidth, 1, maxColumnCount); manager.setSpanCount(mSpanCount); } if (hasHeader) { manager.setSpanSizeLookup(gridLayoutManager); } } }