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):

  • Le bouton coupé ne reçoit pas d'entrée tactile
  • FindViewById (int) renvoie null sur un bouton spécifique dans Android 3.1 autres versions c'est très bien
  • Fichiers de mise en page XML et espace de noms Android
  • Android essayant d'exécuter mon projet en eclipse et finir avec xml.out
  • Impossible d'initialiser LoginButton Facebook-sdk pour Android
  • RadioGroup étendant RelativeLayout?
  •  |----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…

  • Défilement du texte au-dessus des boutons, des boutons fixés au bas
  • Animation d'échelle d'image Android par rapport au point central
  • ClassCastException android.widget.FrameLayout $ LayoutParams à android.support.v4.widget.DrawerLayout $ LayoutParams
  • Obtenir une activité du contexte dans Android
  • Comment faire apparaître la fenêtre de mise en page graphique dans Eclipse pour la conception d'applications Android?
  • Question UI Android. Guide de mise en œuvre
  • 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.