अद्यतन १
एंड्रॉइड सपोर्ट लाइब्रेरी 23.2.0 के बाद से लेआउटमैन के setAutoMeasureEnabled(true)
लिए जोड़ा गया तरीका था। यह सामग्री को लपेटने के लिए RecyclerView बनाता है और एक आकर्षण की तरह काम करता है।
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
तो बस कुछ इस तरह से जोड़ें:
LayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
अद्यतन २
चूंकि 27.1.0 setAutoMeasureEnabled
को पदावनत किया जाता है, इसलिए आपको ओवरराइड पद्धति के साथ लेआउटमैनेजर का कस्टम कार्यान्वयन प्रदान करना चाहिएisAutoMeasureEnabled()
लेकिन उपयोग के कई मामलों के बाद RecyclerView मैं दृढ़ता से इसे रैपिंग मोड में उपयोग नहीं करने की सलाह देता हूं , क्योंकि यह वह नहीं है जो इसके लिए अभिप्रेत है। कई मदों के प्रकारों के साथ सामान्य एकल RecyclerView का उपयोग करके अपने पूरे लेआउट को फिर से बनाने की कोशिश करें। या LinearLayout के साथ दृष्टिकोण का उपयोग करें जिसे मैंने नीचे अंतिम उपाय के रूप में वर्णित किया है
पुराना उत्तर (अनुशंसित नहीं)
आप RecyclerView
अंदर उपयोग कर सकते हैं NestedScrollView
। सबसे पहले आपको अपने स्वयं के कस्टम को लागू करना चाहिए LinearLayoutManager
, यह आपकी RecyclerView
सामग्री को लपेटने के लिए बनाता है। उदाहरण के लिए:
public class WrappingLinearLayoutManager extends LinearLayoutManager
{
public WrappingLinearLayoutManager(Context context) {
super(context);
}
private int[] mMeasuredDimension = new int[2];
@Override
public boolean canScrollVertically() {
return false;
}
@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++) {
if (getOrientation() == HORIZONTAL) {
measureScrapChild(recycler, i,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
heightSpec,
mMeasuredDimension);
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
measureScrapChild(recycler, i,
widthSpec,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
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.getVisibility() == View.GONE) {
measuredDimension[0] = 0;
measuredDimension[1] = 0;
return;
}
// For adding Item Decor Insets to view
super.measureChildWithMargins(view, 0, 0);
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() + getDecoratedTop(view) + 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);
}
}
इसके बाद इसे LayoutManager
अपने लिए इस्तेमाल करेंRecyclerView
recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));
लेकिन आपको उन दो तरीकों को भी कॉल करना चाहिए:
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);
यहां setNestedScrollingEnabled(false)
स्क्रॉलिंग को अक्षम करें RecyclerView
, इसलिए यह स्क्रॉलिंग इवेंट को इंटरसेप्ट नहीं करता है NestedScrollView
। और setHasFixedSize(false)
निर्धारित करें कि एडेप्टर सामग्री में परिवर्तन के आकार को बदल सकते हैंRecyclerView
महत्वपूर्ण नोट: यह समाधान कुछ मामलों में थोड़ा छोटा है और इसमें ख़ुराक के साथ समस्याएँ हैं, इसलिए यदि आपके पास बहुत से आइटम हैं तो RecyclerView
मैं LinearLayout
सूची दृश्य के कस्टम- आधारित कार्यान्वयन का उपयोग करने की सलाह दूंगा, इसके लिए एडेप्टर का एनालॉग बनाएं और इसे बनाएं जैसा व्यवहार ListView
याRecyclerView