Android RecycleView增加最大高度和宽度属性

一、前言:

在日常开发中,想直接通过android:maxHeight或android:maxWidth在布局文件中限制RecyclerView的最大高度宽度,是无法实现的。通过自定义RecyclerView,覆盖onMeasure方法。在onMeasure方法内部,当发现自身高度或宽度超过限制的最大高度或宽度,则手动将宽或高设置为期望的最大宽或搞。具体代码实现如下:

1、自定义MaxLimitRecyclerView

    /**
     * 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);
        }
    }
    }

2、对应属性xml

注意:在res下的values中创建attrs.xml,导入下面的代码



    
    
        
        
    

图片.png

3、使用


必须指定RecyclerView的最大值和最小值
app:limit_maxHeight="@dimen/dp_255"
app:limit_maxWidth="@dimen/dp_275"
以上,便可实现对RecyclerView最大高度或宽度的限制。


参考:https://www.androidcycle.com/recyclerview

你可能感兴趣的:(Android RecycleView增加最大高度和宽度属性)