Comment mapper une liste de liste à RecyclerView

J'essaie de mapper une List<List<Object>> vers un RecyclerView dans Android, mais le résultat est totalement dérangé.
Par exemple, j'ai une liste de cette liste (juste pour expliquer, pas mon cas réel):

 List<List<String>> list = {{a, b, c}, {d, e}, {f, g, h, i}}; 

Le Recyclerview devrait afficher comme (la première rangée contient trois sous, la seconde a deux et la dernière a quatre):

  • Quelle est la différence entre @id et @ + id?
  • Meilleur éditeur de mise en page XML Android que celui de Eclipse
  • Faire pivoter le marqueur et déplacer l'animation sur une carte comme Uber Android
  • Avertissement: Ce <FrameLayout> peut être remplacé par une balise <fusion>
  • Android - Centre de vision de texte dans LinearLayout
  • Plus de 1 Urls différents et seulement une liste
  •  |----a-----| |----b-----| |----c-----| |=======| |----d-----| |----e-----| |=======| |----f-----| |----g-----| |----h-----| |----i-----| 

    Mais le résultat n'est pas exactement comme l'ordre ci-dessus. Certains éléments sont dupliqués et certains disparaissent. par exemple:

     |----d-----| |----e-----| |----c-----| |=======| |----d-----| |----e-----| |=======| |----f-----| |----a-----| 

    Voici un élément de mon code:

      @Override public void onBindViewHolder(ViewHolder holder, int position) { List<Event> list = eventList.get(position); if (holder.rows < list.size()) { holder.rowViewGroup.removeAllViews(); holder.rows = 0; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView startView = new TextView(context); startView.setLayoutParams(layoutParams); Event headEvent = list.get(0); Calendar startCal = headEvent.getStartCal(); startView.setText(String.format("%tD", startCal)); holder.rowViewGroup.addView(startView); for (final Event event : list) { View element = LayoutInflater.from(context).inflate(R.layout.element, null); //start time view TextView startTimeView = (TextView)element.findViewById(R.id.eventStartTimeInElement); Calendar startTimeCal = event.getStartCal(); startTimeView.setText(String.format("%tl:%tM %tp", startTimeCal, startTimeCal, startTimeCal)); //end date time view TextView endView = (TextView)element.findViewById(R.id.eventEndTimeInElement); Calendar endCal = event.getEndCal(); endView.setText(String.format("%tD %tl:%tM %tp", endCal, endCal, endCal, endCal)); //title view TextView title = (TextView)element.findViewById(R.id.eventTitleInElement); title.setText(event.getTitle()); //member name Drawable divider = context.getResources().getDrawable(R.drawable.divider); ImageView dividerView = new ImageView(context); dividerView.setImageDrawable(divider); holder.rowViewGroup.addView(dividerView); holder.rowViewGroup.addView(element); holder.rows++; } } } 

    Voici ma row.xml:

      <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycleViewRow"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/cardView" android:layout_width="match_parent" android:layout_height="wrap_content" card_view:cardCornerRadius="0dp" card_view:cardElevation="2sp" card_view:cardUseCompatPadding="true" > <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/rowView" android:paddingLeft="20dp" android:paddingRight="20dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/eventStartTimeInRow" /> </LinearLayout> </android.support.v7.widget.CardView> 

    Et element.xml (qui est contenu par row.xml):

      <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/eventStartTimeInElement" android:layout_weight="2" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/eventEndTimeInElement" android:gravity="end" android:layout_weight="1"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="left"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/eventTitleInElement"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="right"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" card_view:cardCornerRadius="2dp" card_view:cardElevation="2sp" card_view:cardUseCompatPadding="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Small Text" android:id="@+id/memberNameInElement" android:gravity="end" /> </android.support.v7.widget.CardView> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout> 

    Et je sais que ce n'est pas une très bonne idée de mettre en œuvre cela, alors quelqu'un pourrait-il me dire une meilleure façon de mettre en œuvre cela? Merci…

  • Comment ouvrir des fichiers xml de mise en page dans Android Layout Editor?
  • Comment rejeter la boîte de dialogue en cliquant sur en dehors de la boîte de dialogue?
  • Utilisation d'animations Android L pour basculer entre les activités
  • Boutons inférieurs à l'affichage en expansion
  • Message "_Problem Loading Widget"
  • ClassCastException android.widget.FrameLayout $ LayoutParams à android.support.v4.widget.DrawerLayout $ LayoutParams
  • One Solution collect form web for “Comment mapper une liste de liste à RecyclerView”

    Je pense que votre meilleur pari est d'aplatir votre liste de listes dans une seule liste.

    Ceci est uniquement aux fins de ListView . Votre adaptateur agira comme si les listes étaient toutes enfilées dans une longue liste.

    Commencez par créer un index de liste unique pour tous les éléments de vos listes imbriquées.

    Par exemple:

      List<List<String>> listOfLists = ... // your original data List<String> listForView = new ArrayList<String>(); for (List<String> innerList : listOfLists) { for (String str : innerList) { listForView.add(str); } listForView.add("---"); // eg marker value for divider } 

    Maintenant, dans le getItem() votre adaptateur, il getItem() suffit de renvoyer la listForView.get(position) .

    Chaque fois que votre structure de liste imbriquée change, vous refondez cette opération d'aplatissement et appelez notifyDataSetChanged() .

    Les choses deviennent un peu plus difficiles si – compte tenu de la position – vous devez déterminer la liste d' un élément, mais vous pouvez toujours indexer les listes internes de la même manière.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.