Wie karte ich eine Liste der Liste zu RecyclerView

Ich versuche, eine List<List<Object>> zu einem RecyclerView in Android zuzuordnen, aber das Ergebnis ist total durcheinander gebracht.
Zum Beispiel habe ich eine Liste der Liste wie diese (nur für die Erklärung, nicht meine echte Fall):

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

Der Recyclerview sollte wie (erste Zeile enthält drei Subrows, zweite hat zwei und der letzte hat vier):

  • Warum "Buttons in Button Bars sollten randlos sein" in Android API Level 15?
  • Alternative zu verschachtelten Gewichten mit LinearLayouts
  • Warum ist meine Android-UI, die wütend ist, wann immer ich versuche, Text auszuwählen?
  • GridLayout (nicht GridView) wie man alle Kinder gleichmäßig streckt
  • Android entfernen Taste dynamisch
  • Verwenden eines SupportToolbar für das Telefonlayout und eine eigenständige Actionbar für das Tabletlayout
  •  |----a-----| |----b-----| |----c-----| |=======| |----d-----| |----e-----| |=======| |----f-----| |----g-----| |----h-----| |----i-----| 

    Aber das Ergebnis ist nicht genau wie die obige Reihenfolge. Ein Element wird dupliziert und einige verschwinden. beispielsweise:

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

    Hier ist ein Stück meines Codes:

      @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++; } } } 

    Hier ist mein 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> 

    Und element.xml (die von row.xml enthalten ist):

      <?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> 

    Und ich weiß, das ist nicht eine wirklich gute Idee, um dies zu implementieren, also könnte jemand mir bitte einen besseren Weg, um dies zu implementieren? Vielen Dank…

  • Ausrichten von ImageView rechts vom Layout android
  • Nachdem ich die apk entfernt habe, wann immer ich Debug starten, sagt es mir, dass das Paket nicht installiert ist
  • Android-L CardView Visual Touch Feedback
  • Wie man programmgesteuert TTS Default Engine ändert
  • Benutzerdefinierte Spinner / Dropdown-Menü
  • Eclipse-Fehler: Fehler beim Analysieren ... \ android-22 \ android-wear \ armeabi-v7a \ devices.xml
  • One Solution collect form web for “Wie karte ich eine Liste der Liste zu RecyclerView”

    Ich denke, Ihre beste Wette ist, Ihre Liste der Listen in eine Liste zu glätten.

    Dies ist nur für die Zwecke der ListView . Ihr Adapter wird so handeln, als ob die Listen alle in eine lange Liste eingestiegen sind.

    Beginnen Sie mit dem Erstellen eines Ein-Listen-Index für alle Elemente Ihrer verschachtelten Listen.

    Beispielsweise:

      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 } 

    Jetzt in deines Adapters getItem() braucht nur return listForView.get(position) .

    notifyDataSetChanged() , wenn sich Ihre verschachtelte Listenstruktur ändert, wiederholen Sie diese Abflachung und rufen notifyDataSetChanged() .

    Es wird ein wenig schwieriger, wenn – angesichts der Position – du herausfinden musst, welche Liste ein Artikel ist, aber du könntest immer die inneren Listen in ähnlicher Weise indizieren.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.