安卓进阶

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

2020-12-01  本文已影响0人  因为我的心

一、前言:

在日常开发中,想直接通过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

<?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>

3、使用

<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最大高度或宽度的限制。


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

上一篇 下一篇

猜你喜欢

热点阅读