2015-04-15 17 views
7

Ich versuche, eine List<List<Object>> zu einem RecyclerView in Android zuzuordnen, aber das Ergebnis ist total durcheinander.
Zum Beispiel, ich habe eine Liste der Liste wie folgt (nur zur Erläuterung, nicht mein richtiger Fall):Wie man eine Liste von Liste RecyclerView zuordnen

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

die Recyclerview sollte wie (erste Zeile enthält drei Unterzeilen angezeigt werden, die zweite hat zwei und die letzte auf hat vier):

|----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. Zum Beispiel:

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

Hier ist ein Stück meines 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++; 
     } 
    } 
} 

Hier ist meine 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 Zeile enthalten ist. 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> 

Und ich weiß, das ist kein wirklich gehen od Idee, dies zu implementieren, also könnte mir bitte jemand einen besseren Weg sagen, dies zu implementieren? Danke ...

Antwort

0

Ich denke, Ihre beste Wette ist, Ihre Liste von Listen in eine Liste zu verflachen.

Dies ist nur für die Zwecke der ListView. Ihr Adapter verhält sich so, als ob die Listen alle in einer langen Liste aufgereiht wären.

Beginnen Sie mit der Erstellung eines einzeiligen Index für alle Elemente Ihrer verschachtelten Listen.

Zum Beispiel:

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("---"); // e.g. marker value for divider 
    } 

Jetzt in Ihrem Adapter getItem() der braucht nur listForView.get(position) zurück.

Jedes Mal, wenn sich Ihre geschachtelte Listenstruktur ändert, wiederholen Sie diese Abflachung und rufen Sie notifyDataSetChanged() an.

Die Dinge ein wenig komplizierter, wenn — angesichts der Position — Sie, welche Liste ein Element ist, um herauszufinden, aber man konnte die inneren Listen in ähnlicher Weise immer Index.

+0

Aber ich möchte wirklich CardView verwenden, um jede Gruppe zu trennen. Was ist ein besserer Ansatz, um dies zu erreichen, wenn ich eine flatten Liste verwende – CrackThisRay

+0

xia0guang - Ich möchte etwas ähnliches tun. Hast du Fortschritte gemacht? –

+0

AI L-- Ich verwende verschiedene Arten von Zeilen, um es zu lösen. du solltest es versuchen. überschreiben Sie einfach getItemType() und machen Sie eine Reihe von verschiedenen Zeilen. Für meinen Fall verwende ich die Größe der Unterliste, um itemType anzugeben, und benutze die for-Schleife, um eine andere Größe der Unterzeile hinzuzufügen. vielleicht wird dir helfen. – CrackThisRay

Verwandte Themen