मैं एक है DialogFragment
कि एक में शामिल है RecyclerView
(कार्ड की सूची)।
इसके भीतर RecyclerView
एक या एक से अधिक CardViews
ऊंचाई हो सकती है।
मैं इसे DialogFragment
सही ऊंचाई देना चाहता हूं जो इस पर आधारित CardViews
हो।
आम तौर पर यह आसान होगा, मैं तय करेगा wrap_content
पर RecyclerView
इस तरह।
<android.support.v7.widget.RecyclerView ...
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:scrollbars="vertical" >
</android.support.v7.widget.RecyclerView>
क्योंकि मैं RecyclerView
इसका उपयोग कर रहा हूँ यह देखने के लिए काम नहीं करता है:
https://issuetracker.google.com/issues/37001674
तथा
नेस्ट रिसाइकलर की ऊंचाई इसकी सामग्री को लपेटती नहीं है
इन दोनों पृष्ठों पर लोग विस्तार करने LinearLayoutManager
और ओवरराइड करने का सुझाव देते हैंonMeasure()
मैंने पहली बार LayoutManager का उपयोग किया है जो किसी ने पहले लिंक में प्रदान किया है:
public static class WrappingLayoutManager extends LinearLayoutManager {
public WrappingLayoutManager(Context context) {
super(context);
}
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);
measureScrapChild(recycler, 0,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
int width = mMeasuredDimension[0];
int height = mMeasuredDimension[1];
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
width = widthSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
height = heightSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(width, 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 childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth();
measuredDimension[1] = view.getMeasuredHeight();
recycler.recycleView(view);
}
}
}
हालांकि यह काम नहीं किया क्योंकि
heightSize = View.MeasureSpec.getSize(heightSpec);
एक बहुत बड़ा मान लौटाता है जो इससे संबंधित प्रतीत होता है match_parent
।
टिप्पणी करके height = heightSize;
(दूसरे स्विच केस में) मैं ऊंचाई पर काम करने में कामयाब रहा, लेकिन केवल तभी जब कोई TextView
बच्चा अंदर CardView
अपना पाठ (एक लंबा वाक्य) नहीं लपेटता।
जैसे ही TextView
यह लपेटता है यह स्वयं का पाठ होता है ऊंचाई बढ़ जाती है, लेकिन यह नहीं है। इसने एक लंबी रेखा के रूप में उस लंबी वाक्य की ऊंचाई की गणना की, न कि एक लिपटी हुई रेखा (2 या अधिक) की।
इस बारे में कोई सलाह कि मुझे LayoutManager
अपने RecyclerView
कार्यों में सुधार कैसे करना चाहिए WRAP_CONTENT
?
संपादित करें: यह लेआउट प्रबंधक अधिकांश लोगों के लिए काम कर सकता है, लेकिन इसमें अभी भी स्क्रॉलिंग और रैपिंग टेक्स्ट की ऊँचाई की गणना करने में समस्याएं हैं
public class MyLinearLayoutManager extends LinearLayoutManager {
public MyLinearLayoutManager(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++) {
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);
}
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 childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = 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);
}
}
}
Jan 22, 2016: This has been merged into the internal tree, should be available with the next version of support library.