CardView Layout_width = "match_parent" माता-पिता RecyclerView की चौड़ाई से मेल नहीं खाता है


123

मेरे पास एक टुकड़ा है जिसमें RecyclerView के साथ लेआउट_ एक्सपोज़र = "match_parent" है:

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment" />

RecyclerView में आइटम एक कार्ड दृश्य है जिसमें layout_width = "match_parent" भी है:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:layout_gravity="center"
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent"
        android:textAppearance="?android:textAppearanceLarge"/>
</android.support.v7.widget.CardView>

मैं नीचे के रूप में आइटम दृश्य बढ़ा:

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        CardView v = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_listitem, null, true);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

लेकिन जब मैं ऐप चलाता हूं, तो कार्डव्यू को नीचे दिखाए अनुसार wra_content के रूप में प्रस्तुत किया जाता है:

CardsBug

ध्यान दें कि यह एमुलेटर पर चलाया गया था, वास्तविक डिवाइस नहीं।

क्या मैं कुछ गलत कर रहा हूँ, या यह एक बग है?


जब CardView को फुलाते हैं, तो क्या आप एक सच्चे पैरामीटर के साथ मूल दृश्य की आपूर्ति कर रहे हैं?
नाहरमन

हाय @NiekHaarman, कृपया संपादन देखें। मैंने फुलाया कोड जोड़ा। और हाँ मैंने सही पैरामीटर पास किया है।
प्रोगामर जूल

जवाबों:


291

इसके लिए डॉक्स inflate:

निर्दिष्ट xml संसाधन से एक नया दृश्य पदानुक्रम को इनफ़्लो करें। यदि कोई त्रुटि है, तो InflateException को फेंकता है।

XML लेआउट संसाधन को लोड करने के लिए पैरामीटर
संसाधन ID (जैसे, R.layout.main_page) रूट
दृश्य जनरेट किए गए पदानुक्रम के माता-पिता होने के लिए (यदि अनुलग्नक सही है), या अन्यथा रूट के लिए लेआउटप्रैम मान का एक सेट प्रदान करने वाली कोई वस्तु लौटा हुआ पदानुक्रम (यदि अनुलग्नकटूट गलत है।)
संलग्न करेंटूट करें क्या फुलाया गया पदानुक्रम रूट पैरामीटर से जुड़ा होना चाहिए? यदि गलत है, तो रूट का उपयोग केवल XML में रूट दृश्य के लिए लेआउटप्रेमम्स का सही उपवर्ग बनाने के लिए किया जाता है। रिटर्न फुलाया पदानुक्रम का मूल दृश्य। यदि रूट की आपूर्ति की गई थी और अनुलग्नक सही है, तो यह रूट है; अन्यथा यह फुली हुई XML फ़ाइल की जड़ है।

यहां यह महत्वपूर्ण है करने के लिए नहीं सच की आपूर्ति, लेकिन करते हैं माता-पिता की आपूर्ति:

LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

parentदृश्य की आपूर्ति से इन्फ्लोटर को पता चल जाता है कि लेआउटपरम का उपयोग क्या है। आपूर्ति falseपैरामीटर बताता है इसे करने के लिए नहीं बस अभी तक माता-पिता के लिए देते। यही RecyclerViewआपके लिए काम करेगा।


4
समाधान मेरे लिए काम नहीं किया क्योंकि ListView's layout_widthथा wrap_content। यह अजीब है क्योंकि यह सूची दृश्य को प्रभावित नहीं करना चाहिए! तो मेरी समझ यह है कि जब आप लेआउटिनफ्लैटर के लिए एक पैरामीटर के रूप में गलत प्रदान करते हैं, तो सूची दृश्य सूची के मापदंडों के साथ सूची आइटम को सूची दृश्य में ही मिलान करता है! : ०
१५

1
क्या आप थोड़ा और कोड पोस्ट कर सकते हैं, क्योंकि मुझे लगता है कि मैं भी यही कर रहा हूं, लेकिन वास्तव में यह काम नहीं कर रहा है
rodi

1
मैं फुला रहा हूं कि आप कैसे सुझाव देते हैं और मेरे लिए काम नहीं कर रहे हैं।
जैपनीजोलिका

3
मुझे लगता है कि सही समझ यह है कि जब आप अनुलग्नक को गलत में सेट करते हैं, तो आपको परिभाषित लेआउटप्रेम मूल्य के साथ एक वस्तु की आपूर्ति करने की आवश्यकता होती है। यह जरूरी नहीं कि माता-पिता ही हों। "... बस एक ऐसी वस्तु है जो लौटी पदानुक्रम की जड़ के लिए LayoutParams मानों का एक सेट प्रदान करती है (यदि अटैचमेंट गलत है)। एक अन्य वस्तु पैरामीटर यह सूचित करने के लिए?
hjchin

1
यदि मैं कस्टम दृश्य का उपयोग करता हूं, तो इससे कैसे निपटें? मेरा मतलब हैViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
क्रॉस

65

CardView करने के लिए तत्काल माता-पिता के रूप में RelativeLayout का उपयोग करें।

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>

हाँ यह मेरे लिए भी काम कर रहा था। मैं LinearLayout का उपयोग कर रहा था और ऊपर दिया गया सुझाव काम नहीं कर रहा था क्योंकि मैं पहले से ही वास्तव में ऐसा कर रहा था (यानी रूट को संलग्न नहीं कर रहा था, लेकिन माता-पिता को प्रदान करना)। आपको RelativeLayout दोनों को करना होगा + माता-पिता को संलग्न नहीं करना, बल्कि एक प्रदान करना।
चूबसॉन्ड्यूब

1
यह मेरे लिए काम करता है, लेकिन मुझे नहीं पता कि यह समस्या क्यों हल कर सकता है। क्या कोई समझा सकता है क्यों?
जॉनी

1
यह उम्र हो गई है, एंड्रॉइड x उत्पादन में है, फिर भी बग को ठीक नहीं किया गया है!
मुहम्मद नदरई

सबसे आसान तरीका।
अब्दुर्रहमान पोपल

मेरे पास एक समान समस्या थी और इसने मेरे कार्ड दृश्य की चौड़ाई को सही करने के लिए काम किया लेकिन मुझे ऊंचाई के साथ भी ऐसी ही समस्या है? क्या आप मुझे उसके लिए भी कुछ सुझा सकते हैं?

12

इसने मेरे लिए काम किया,

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, null, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 return new ViewOffersHolder(viewHolder);

6

जिस तरह से मैंने किया वह है:

View view = mInflater.inflate(R.layout.row_cardview, null, true);
            WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            int width = windowManager.getDefaultDisplay().getWidth();
            view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT));

स्पष्टीकरण: अपने onCreateViewHolde में एक बार कार्ड देखने के बाद, स्क्रीन की चौड़ाई प्राप्त करें और फिर कार्ड दृश्य के अनुसार लेआउट परम सेट करें।


1
कृपया इसे थोड़ा सुधारें। यह मूल रूप से "
ड्रू

जोड़ा गया स्पष्टीकरण। कृपया जांच करें और यदि किसी और सहायता की आवश्यकता हो, तो यहां टिप्पणी करें।
राहुल


4

बस नया लेआउट परमेस सेट करें

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));

मुझे ऐसा देखने को मिला onBindViewHolder () एक कस्टम व्यू क्लास का उपयोग करते समय उपयोगी है जो कांस्ट्रेन्थलाईट से विरासत में मिला है।
रासमुस्सोब

यह एक अच्छा जवाब नहीं है क्योंकि लेआउट में सेट किया गया मार्जिन प्रभावित होगा।
ईएम रज़

4

डिफ़ॉल्ट कार्यान्वयन डिफ़ॉल्ट लेआउट प्रबंधक में wra_content के उपयोग को मजबूर करता है :

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

आपको बस इस तरीके को अपने लेआउटमैन में इस तरह से ओवरराइड करना है:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

2

यह मेरे लिए काम करता है

View view = inflator.inflate(R.layout.layout_item, ***null***, false);

1

कार्ड_व्यू का उपयोग करें: एक नकारात्मक मूल्य के साथ सामग्रीपैड

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    card_view:contentPadding="-4dp"
    card_view:cardElevation="0dp"
    android:layout_height="wrap_content">

इसने मेरे लिए काम किया


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.