美文网首页安卓进阶
Android RecycleView增加最大高度和宽度属性

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

作者: 因为我的心 | 来源:发表于2020-12-01 09:42 被阅读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

    相关文章

      网友评论

        本文标题:Android RecycleView增加最大高度和宽度属性

        本文链接:https://www.haomeiwen.com/subject/aebjwktx.html