網格佈局的RecyclerView高度隨Item自適應
表格樣式的RecyclerView高度隨Item自適應 的解決辦法就是自己去重寫佈局管理器GridLayoutManager。
package com.art.artcircle.widget; import android.content.Context; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; public class WrapHeightGridLayoutManager extends GridLayoutManager { private int mChildPerLines; private int[] mMeasuredDimension = new int[2]; public WrapHeightGridLayoutManager(Context context, int spanCount) { super(context, spanCount); this.mChildPerLines = spanCount; } @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int height = 0; for (int i = 0; i < getItemCount(); ) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); height = height + mMeasuredDimension[1]; i = i + mChildPerLines; } // If child view is more than screen size, there is no need to make it wrap content. We can use original onMeasure() so we can scroll view. if (height >heightSize) { switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(widthSize, height); } else { super.onMeasure(recycler, state, widthSpec, heightSpec); } } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { View view = recycler.getViewForPosition(position); // For adding Item Decor Insets to view super.measureChildWithMargins(view, 0, 0); if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view), p.width); int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom() + getPaddingBottom() + getDecoratedBottom(view), p.height); view.measure(childWidthSpec, childHeightSpec); // Get decorated measurements measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin; measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin; recycler.recycleView(view); } } }
在Activity中這樣使用:
WrapHeightGridLayoutManager gm = new WrapHeightGridLayoutManager(mContext, Constant.RECYCLERVIEW_SIZE_GRIDLAYOUT_FIVE); mPhotosRcv.setLayoutManager(gm);
這樣就完美實現你想要的RecyclerView高度隨Item自適應效果了。
========================新版無用================================
直接用gridLayoutManager.setAutoMeasureEnabled(true);