Skip to content Skip to sidebar Skip to footer

Set Height Of Inner Recyclerview Wrap_content

I have a recyclerview inside another recyclerview. I want to make height of inner recyclerview 'warp_content'. I came to know it is possible with new version of recyclerview which

Solution 1:

Because I am using a RecyclerView this does not work see:

https://code.google.com/p/android/issues/detail?id=74772

and

Nested Recycler view height doesn't wrap it's content

On both of these pages people suggest to extend LinearLayoutManager and to override onMeasure()

RecyclerView doesn't have the wrap_content by default. You have to use the RecyclerView with wrap_content Layout Manager such as, WrapLinearLayoutManager e.g CustomLinearLayoutManager .

CustomLinearLayoutManager.java

publicclassCustomLinearLayoutManagerextendsLinearLayoutManager {

privatestaticfinalStringTAG= CustomLinearLayoutManager.class.getSimpleName();

publicCustomLinearLayoutManager(Context context) {
    super(context);
}

publicCustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

privateint[] mMeasuredDimension = newint[2];

@OverridepublicvoidonMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {

    finalintwidthMode= View.MeasureSpec.getMode(widthSpec);
    finalintheightMode= View.MeasureSpec.getMode(heightSpec);
    finalintwidthSize= View.MeasureSpec.getSize(widthSpec);
    finalintheightSize= View.MeasureSpec.getSize(heightSpec);

    intwidth=0;
    intheight=0;
    for (inti=0; i < getItemCount(); i++) {
        measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
            mMeasuredDimension);


        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:
            width = widthSize;
        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(width, height);
}

privatevoidmeasureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
                           int heightSpec, int[] measuredDimension) {
    try {
        Viewview= recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsExceptionif (view != null) {
            RecyclerView.LayoutParamsp= (RecyclerView.LayoutParams) view.getLayoutParams();

            intchildWidthSpec= ViewGroup.getChildMeasureSpec(widthSpec,
                getPaddingLeft() + getPaddingRight(), p.width);

            intchildHeightSpec= ViewGroup.getChildMeasureSpec(heightSpec,
                getPaddingTop() + getPaddingBottom(), p.height);

            view.measure(childWidthSpec, childHeightSpec);
            measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
            measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
            recycler.recycleView(view);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

}

Solution 2:

Setting recyclerview item works for me. Outer wrapper relative layout is added intentionally to address issue layout_height="wrap_content" does NOT occupy the height of all the elements added to it via adapter. The result is cut out items that is outside of device viewport when it loads initially. Wrapping "RecyclerView" with "RelativeLayout" fixes the issue on Marshmallow devices.

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:descendantFocusability="blocksDescendants"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_test"android:layout_width="match_parent"android:layout_height="wrap_content"tools:listitem="@layout/test_item"></android.support.v7.widget.RecyclerView></RelativeLayout>

Post a Comment for "Set Height Of Inner Recyclerview Wrap_content"