我正在尝试映射列表< List< Object>>在
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)); //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)); //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(由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>
我知道实现这个并不是一个好主意,所以有人可以告诉我一个更好的方法来实现它吗?谢谢…
解决方法
我认为最好的办法是将列表清单压缩到一个列表中.
这仅用于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().
如果 – 给定位置 – 你必须找出一个项目所在的列表,但事情变得有点棘手,但你总是可以用类似的方式索引内部列表.