Set Height Of Inner Recyclerview Wrap_content
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"