package com.gh.common.util; import android.content.Context; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; /** * Created by khy on 2016/8/22. * RecyclerView 自适应高度 */ public class MeasureHeightLayoutManager extends LinearLayoutManager { private int[] mMeasuredDimension = new int[1]; public MeasureHeightLayoutManager(Context context) { super(context); } @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int heightSize = View.MeasureSpec.getSize(heightSpec); int height = 0; for (int i = 0; i < getItemCount(); i++) { try { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); height = height + mMeasuredDimension[0]; } catch (Exception e) { e.printStackTrace(); } } if (height > heightSize) { super.onMeasure(recycler, state, widthSpec, heightSpec); } else { setMeasuredDimension(View.MeasureSpec.getSize(widthSpec), height); } } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) throws Exception { View view = recycler.getViewForPosition(position); if (view.getVisibility() == View.GONE) { measuredDimension[0] = 0; return; } super.measureChildWithMargins(view, 0, 0); RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childHeightSpec = ViewGroup.getChildMeasureSpec( heightSpec, getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view), p.height); view.measure(0, childHeightSpec); measuredDimension[0] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin; recycler.recycleView(view); } }