12

जिस गतिविधि के बारे में मैं बात कर रहा हूं उसे रीसाइक्लर व्यूकार्डव्यू द्वारा आइटम के रूप में दिखाया जाना चाहिए। मेरा लक्ष्य प्रत्येक कार्ड में एक रीसाइक्लिंग व्यू को अपनी बारी में दिखाना है।एंड्रॉइड: मैं कार्डव्यू के अंदर एक रीसाइक्लिंग व्यू कैसे डाल सकता हूं?

यहाँ मेरी गतिविधि की बुनियादी xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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" 
    tools:context=".ConjActivity" > 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/conjCardList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="false" /> 

</LinearLayout> 

और यहाँ मेरी CardView के RecyclerView के लेआउट है:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_analysis" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="@dimen/activity_vertical_margin" 
    android:layout_marginBottom="@dimen/activity_vertical_margin" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin" 
    android:layout_marginRight="@dimen/activity_horizontal_margin" 
    android:padding="5dp" 
    card_view:cardCornerRadius="5dp" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/item_mode" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingTop="5dp" 
      android:paddingLeft="@dimen/activity_horizontal_margin" > 

     </android.support.v7.widget.RecyclerView> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

तो, मैं निर्भीकता दो RecyclerView.Adapters को लागू करने से मेरा पहला प्रयास किया , एक (चलो इसे कॉल करें) "मुख्य" रीसाइक्लर व्यू और प्रत्येक कार्डव्यू में एकल के लिए एक:

यहां टी हैं वह दो कोड:

"मुख्य" RecyclerView (ViewHolders/डब्ल्यू):

public class ConjCardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

    private static Context context; 
    private LinearLayoutManager llm; 
    private static ConjFormAdapter formAdapt; 
    private ArrayList<String> adapterList; 
    private List<Object> items; 
    private static final int 
      HEADER = 0, 
      CONJTYPE = 1, 
      ITEM = 2; 
    private Paradigma par; 
    private String sel_vb; 

    public ConjCardAdapter(List<Object> items){ 
     this.items = items; 
     context = ConjActivity.context; 
     adapterList = new ArrayList<String>(); 
     formAdapt = new ConjFormAdapter(adapterList); 
    } 

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){ 

     switch(viewType){ 
     case HEADER: 
      return new HeaderHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_header, viewGroup, false)); 
     case CONJTYPE: 
      return new ConjTypeHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_conjtext, viewGroup, false)); 
     case ITEM: 
      return new ItemModeHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_item, viewGroup, false)); 
     default: 
      return null; 
     } 
    } 

    public void onBindViewHolder(RecyclerView.ViewHolder vvh, final int pos) { 
     HeaderItem headerItem; 
     String stringItem; 
     ArrayList<String> listItem; 
     HeaderHolder hh; 
     ConjTypeHolder cjh; 
     ItemModeHolder imh; 

     switch(getItemViewType(pos)){ 
     case HEADER: 
      // it doesn't really matter... 
      break; 
     case CONJTYPE: 
      // it doesn't really matter... 
      break; 
     case ITEM: 
      listItem = (ArrayList<String>) items.get(pos); 
      imh = (ItemModeHolder) vvh; 
      llm = new LinearLayoutManager(context); 
      imh.rv_mode.setLayoutManager(llm); 
      adapterList.addAll(listItem); 
      imh.rv_mode.setAdapter(formAdapt); 
      formAdapt.notifyDataSetChanged(); 
      break; 
     }   
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

     switch(position){ 
     case 0: 
      return HEADER; 
     case 1: 
      return CONJTYPE; 
     default: 
      return ITEM; 
     } 
    } 


    static class HeaderHolder extends RecyclerView.ViewHolder{ 

     TextView verbo, 
       paradigma, 
       analisi; 
     View divider; 

     public HeaderHolder(View itemView) { 
      super(itemView); 
      verbo = (TextView) itemView.findViewById(R.id.verb); 
      paradigma = (TextView) itemView.findViewById(R.id.paradigm); 
      analisi = (TextView) itemView.findViewById(R.id.analysis); 
      divider = (View) itemView.findViewById(R.id.divider); 
     } 
    } 

    static class ConjTypeHolder extends RecyclerView.ViewHolder{ 

     TextView type; 

     public ConjTypeHolder(View itemView) { 
      super(itemView); 
      type = (TextView) itemView.findViewById(R.id.conj_type); 
     } 
    } 
: 
    static class ItemModeHolder extends RecyclerView.ViewHolder{ 

     RecyclerView rv_mode; 

     public ItemModeHolder(View itemView) { 
      super(itemView); 
      rv_mode = (RecyclerView) itemView.findViewById(R.id.item_mode); 
     } 
    } 

} 

आइटम 'RecyclerView (w/ViewHolder):

public class ConjFormAdapter extends RecyclerView.Adapter<ConjFormAdapter.FormHolder>{ 

    private Context context; 
    private ArrayList<String> list; 
    private Paradigma par; 
    private String sel_vb; 
    private ArrayList<Long> ids; 
    private HashMap<String, Long> mIdMap; 
    private StringAnalisi analisi; 
    private final int IND_MODE_TYPE=0, 
      ELSE_MODE_TYPE=1, 
      TENSE_TYPE=2, 
      FORM_TYPE=3; 

    public ConjFormAdapter(ArrayList<String> list){ 
     this.list = list; 
     // Constructor implementation 
    } 

    // other methods 

    @Override 
    public FormHolder onCreateViewHolder(ViewGroup viewGroup, int itemType) { 
     switch(itemType){ 
     case IND_MODE_TYPE: 
      return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_mode_ind, viewGroup, false)); 
     case ELSE_MODE_TYPE: 
      return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_mode_else, viewGroup, false)); 
     case TENSE_TYPE: 
      return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_tense, viewGroup, false)); 
     default: 
      return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_form, viewGroup, false)); 
     } 
    } 

    @Override 
    public void onBindViewHolder(FormHolder fh, int pos) { 

     fh.txt.setText(list.get(pos)); 

     // other implementation 

    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     String item = (String) list.get(position); 
     if(item.equals(context.getResources().getString(R.string.ind))){ 
      return IND_MODE_TYPE; 
     } else if(item.equals(context.getResources().getString(R.string.subj))||item.equals(context.getResources().getString(R.string.imp))||item.equals(context.getResources().getString(R.string.inf))||item.equals(context.getResources().getString(R.string.pt))||item.equals(context.getResources().getString(R.string.ger))||item.equals(context.getResources().getString(R.string.gerv))||item.equals(context.getResources().getString(R.string.sup))){ 
      return ELSE_MODE_TYPE; 
     } else if(item.equals(context.getResources().getString(R.string.pres))||item.equals(context.getResources().getString(R.string.impf))||item.equals(context.getResources().getString(R.string.fut))||item.equals(context.getResources().getString(R.string.pf))||item.equals(context.getResources().getString(R.string.ppf))||item.equals(context.getResources().getString(R.string.futant))){ 
      return TENSE_TYPE; 
     } else { 
      return FORM_TYPE; 
     } 
    } 

    @Override 
    public long getItemId(int position) { 

     String item = list.get(position); 
     return mIdMap.get(item); 
    } 

    @Override 
    public void setHasStableIds(boolean hasStableIds) { 
     super.setHasStableIds(true); 
    } 


    static class FormHolder extends RecyclerView.ViewHolder{ 

     TextView txt; 
     View divider1, divider2, divider3; 

     public FormHolder(View itemView) { 
      super(itemView); 
      txt = (TextView) itemView.findViewById(R.id.text1); 
      divider1 = (View) itemView.findViewById(R.id.conj_divider1); 
      divider2 = (View) itemView.findViewById(R.id.conj_divider2); 
      divider3 = (View) itemView.findViewById(R.id.conj_divider3); 
     } 
    } 
} 

आप देख सकते हैं मैं यह सोचा पहले एडाप्टर को दूसरे में तुरंत चालू करने का अधिकार था, और प्रत्येक आइटम के रीसाइक्लर व्यू के लिए एक नया लेआउटमैनेजर संलग्न करने और दूसरा एडाप्टर सेट करने के लिए। लेकिन जैसा कि आप मेरे "मुख्य" रिक के पहले दो आइटम देख सकते हैं। देखें जिसमें कोई अन्य रिक शामिल नहीं है। देखें कार्य ठीक है, लेकिन अन्य नहीं।

The items with a RecyclerView don't show up like they should

मैं कैसे इस मुद्दे को हल कर सकते हैं? कृपया, मैं विचारों से बाहर हूं।

उत्तर

16

मुझे एक ही समस्या का सामना करना पड़ा। आपको कार्डव्यू के अंदर रीसाइक्लिंग व्यू की लेआउट ऊंचाई निर्दिष्ट करनी होगी। इसे wrap_content से डीपी में एक विशिष्ट मान में बदलें। नेस्टेड रीसाइक्लिंग व्यू सामग्री को अपनी ऊंचाई में लपेट नहीं करता है यदि पैरेंट स्क्रॉलिंग वर्टिकल है और इसी तरह सामग्री को इसकी चौड़ाई में लपेट नहीं आता है जब अभिभावक स्क्रॉलिंग हॉरिज़ोनल होता है।

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/card_analysis" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_marginTop="@dimen/activity_vertical_margin" 
android:layout_marginBottom="@dimen/activity_vertical_margin" 
android:layout_marginLeft="@dimen/activity_horizontal_margin" 
android:layout_marginRight="@dimen/activity_horizontal_margin" 
android:padding="5dp" 
card_view:cardCornerRadius="5dp" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/item_mode" 
     android:layout_width="wrap_content" 
     android:layout_height="100dp" 
     android:paddingTop="5dp" 
     android:paddingLeft="@dimen/activity_horizontal_margin" > 

    </android.support.v7.widget.RecyclerView> 
</LinearLayout> 
</android.support.v7.widget.CardView> 
+2

लेकिन अगर मेरे रीसाइक्लर व्यू में परिवर्तनीय सामग्री है तो क्या होगा? क्या वस्तुओं की संख्या के आधार पर ऊंचाई की पसंद स्वचालित करने का कोई तरीका है? –

+0

एक समाधान कार्डव्यू के लिए विभिन्न लेआउट का उपयोग करने के लिए अलग-अलग ऊंचाइयों के रेसीलर व्यूज़ का उपयोग करना और क्रमशः उन्हें लागू करने के लिए स्विच केस (या सशर्त बयान) का उपयोग करना हो सकता है। –

+1

आपके संकेतों के लिए धन्यवाद मैंने अंततः इस मुद्दे को हल किया, और, यदि आप रुचि रखते हैं, तो मेरे दूसरे प्रश्न का समाधान @DenisNek द्वारा http://stackoverflow.com/questions/26649406/nested-recycler-view-height पर लाया गया था -doesnt-wrap-its-content/27616854 # 27616854 –

5

समर्थन पुस्तकालय 23.2 के रूप में, LayoutManager एपीआई ऑटो माप जो अपने आप आकार करने के लिए एक RecyclerView इसकी सामग्री के आकार के आधार की अनुमति देता है लाता है। इसका अर्थ यह है कि RecyclerView के आयाम के लिए WRAP_CONTENT का उपयोग करना अब संभव है। आप लेआउटमेनर्स में निर्मित सभी पाएंगे अब ऑटो-मापन का समर्थन करते हैं।

Source

संबंधित मुद्दे

 संबंधित मुद्दे