2015-04-15 1 views
7

Я пытаюсь сопоставить List<List<Object>> с RecyclerView в Android, но результат полностью перепутался.
Например, у меня есть список списка, как это (только для объяснения, а не мой реальный случай):Как сопоставить список списка с RecyclerView

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

Recyclerview должен отображаться как (первый ряд состоит из трех подстрок, второй имеет два и последний на имеет четыре):

|----a-----| 
|----b-----| 
|----c-----| 
|=======| 
|----d-----| 
|----e-----| 
|=======| 
|----f-----| 
|----g-----| 
|----h-----| 
|----i-----| 

, но результат не совсем такой, как указано выше. некоторый элемент дублируется, а некоторые исчезают. например:

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

Вот часть моего кода:

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

Вот мой 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> 

и element.xml (который содержится по строкам. 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> 

И я знаю, что это действительно не так od идея реализовать это, так может ли кто-нибудь, пожалуйста, сказать мне лучший способ реализовать это? Спасибо ...

ответ

0

Я думаю, что ваш лучший выбор - это сгладить список списков в один список.

Это только для целей ListView. Ваш адаптер будет действовать так, как если бы все списки были привязаны к одному длинному списку.

Начните с создания индекса одного списка для всех элементов ваших вложенных списков.

Например:

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 
    } 

Теперь в вашем адаптера getItem() нужно только вернуть listForView.get(position).

В любое время, когда изменяется структура вашего вложенного списка, вы выполняете повторную операцию выравнивания и вызываете notifyDataSetChanged().

Вещи становятся немного сложнее, если — с учетом позиции — вы должны выяснить, какие список пункт находится, но вы могли всегда индексировать внутренние списки в аналогичным образом.

+0

Но я действительно хочу использовать CardView для разделения каждой группы. Что лучше для достижения этого, если я использую список сглаживания – CrackThisRay

+0

xia0guang - Я ищу что-то подобное. Продвинулись ли вы? –

+0

AI L-- Я использую разные типы строк для его решения. Ты должен попытаться. просто переопределите getItemType() и создайте кучу разных строк. Для моего случая я использую размер подсписчика, чтобы указать itemType и использовать для цикла, чтобы добавить другой размер подстроки. возможно, поможет вам. – CrackThisRay

 Смежные вопросы

  • Нет связанных вопросов^_^