在日常开发中,想直接通过android:maxHeight
或android:maxWidth
在布局文件中限制RecyclerView的最大高度宽度,是无法实现的。通过自定义RecyclerView,覆盖onMeasure
方法。在onMeasure
方法内部,当发现自身高度或宽度超过限制的最大高度或宽度,则手动将宽或高设置为期望的最大宽或搞。具体代码实现如下:
/** * max limit-able RecyclerView */ public class MaxLimitRecyclerView extends RecyclerView { private int mMaxHeight; private int mMaxWidth; public MaxLimitRecyclerView(Context context) { this(context, null); } public MaxLimitRecyclerView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MaxLimitRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); inti(attrs); } private void inti(AttributeSet attrs) { if (getContext() != null && attrs != null) { TypedArray typedArray = null; try { typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MaxLimitRecyclerView); if (typedArray.hasValue(R.styleable.MaxLimitRecyclerView_limit_maxHeight)) { mMaxHeight = typedArray.getDimensionPixelOffset(R.styleable.MaxLimitRecyclerView_limit_maxHeight, -1); } if (typedArray.hasValue(R.styleable.MaxLimitRecyclerView_limit_maxWidth)) { mMaxWidth = typedArray.getDimensionPixelOffset(R.styleable.MaxLimitRecyclerView_limit_maxWidth, -1); } } catch (Exception e) { e.printStackTrace(); } finally { if (typedArray != null) { typedArray.recycle(); } } } } @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); boolean needLimit = false; if (mMaxHeight >= 0 || mMaxWidth >= 0) { needLimit = true; } if (needLimit) { int limitHeight = getMeasuredHeight(); int limitWith = getMeasuredWidth(); if (getMeasuredHeight() > mMaxHeight) { limitHeight = mMaxHeight; } if (getMeasuredWidth() > mMaxWidth) { limitWith = mMaxWidth; } setMeasuredDimension(limitWith, limitHeight); } } }
对应属性xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!--attribute for MaxLimitRecyclerView--> <declare-styleable name="MaxLimitRecyclerView"> <attr name="limit_maxHeight" format="reference|dimension" /> <attr name="limit_maxWidth" format="reference|dimension" /> </declare-styleable> </resources>
使用方式:
<your_package_name.MaxLimitRecyclerView android:id="@+id/act_choose_list" android:layout_width="match_parent" android:layout_height="wrap_content" app:limit_maxHeight="100dp" tools:itemCount="8" />
以上,便可实现对RecyclerView最大高度或宽度的限制。