RecyclerView自适应高度

来源:互联网 发布:mac双系统os不能启动 编辑:程序博客网 时间:2024/05/16 06:06
package com.shcc.microcredit.utils;import android.content.Context;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;public class Mylayout extends LinearLayoutManager {/*    private static final int CHILD_WIDTH = 0;    private static final int CHILD_HEIGHT = 1;    private static final int DEFAULT_CHILD_SIZE = 100;    private final int[] childDimensions = new int[2];    private int childSize = DEFAULT_CHILD_SIZE;    private boolean hasChildSize;*/    @SuppressWarnings("UnusedDeclaration")    public Mylayout(Context context) {        super(context);    }    @SuppressWarnings("UnusedDeclaration")    public Mylayout(Context context, int orientation, boolean reverseLayout) {        super(context, orientation, reverseLayout);    }    private int[] mMeasuredDimension = new int[2];    @Override    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {        final int widthMode = View.MeasureSpec.getMode(widthSpec);        final int heightMode = View.MeasureSpec.getMode(heightSpec);        final int widthSize = View.MeasureSpec.getSize(widthSpec);        final int heightSize = View.MeasureSpec.getSize(heightSpec);        int width = 0;        int height = 0;        for (int i = 0; i < getItemCount(); i++) {            try {                measureScrapChild(recycler, i,                        widthSpec,                        View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),                        mMeasuredDimension);            } catch (IndexOutOfBoundsException e) {                e.printStackTrace();            }            if (getOrientation() == HORIZONTAL) {                width = width + mMeasuredDimension[0];                if (i == 0) {                    height = mMeasuredDimension[1];                }            } else {                height = height + mMeasuredDimension[1];                if (i == 0) {                    width = mMeasuredDimension[0];                }            }        }        switch (widthMode) {            case View.MeasureSpec.EXACTLY:            case View.MeasureSpec.AT_MOST:            case View.MeasureSpec.UNSPECIFIED:        }        switch (heightMode) {            case View.MeasureSpec.EXACTLY:                height = heightSize;            case View.MeasureSpec.AT_MOST:            case View.MeasureSpec.UNSPECIFIED:        }        setMeasuredDimension(widthSpec, height);    }    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) {        View view = recycler.getViewForPosition(position);        if (view != null) {            RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();            int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,                    getPaddingTop() + getPaddingBottom(), p.height);            view.measure(widthSpec, childHeightSpec);            measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;            measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;            recycler.recycleView(view);        }    }    @Override    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {        super.onLayoutChildren(recycler, state);    }

}

用法:

recyclerView.setLayoutManager(new Mylayout(this));

0 0