使用ListAdapter在ScrollView布局中填充LinearLayout

我面临着一个非常普遍的问题:我摆脱了一个活动,现在事实certificate它应该在这个ScrollView显示一些项目。 正常的做法是使用现有的ListAdapter ,将其连接到一个ListViewBOOM我会有我的项目列表。

但是你不应该在ScrollView放置一个嵌套的ListView ,因为它ScrollView – 即使Android Lint也会抱怨。

所以这是我的问题:

如何将ListAdapter连接到LinearLayout或类似的东西?

我知道这个解决scheme不会扩展很多项目,但是我的列表非常短(<10项),所以不需要复用视图。 性能明智,我可以把所有的意见直接放到LinearLayout

我提出的一个解决scheme是将现有的活动布局放置在ListView的headerView部分。 但是,这感觉就像滥用这个机制,所以我正在寻找一个更干净的解决scheme。

想法?

更新:为了激发正确的方向,我添加了一个示例布局来显示我的问题:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/news_detail_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:visibility="visible"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFF" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:paddingLeft="@dimen/news_detail_layout_side_padding" android:paddingRight="@dimen/news_detail_layout_side_padding" android:paddingTop="@dimen/news_detail_layout_vertical_padding" android:paddingBottom="@dimen/news_detail_layout_vertical_padding" > <TextView android:id="@+id/news_detail_date" android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center_horizontal" android:text="LALALA" android:textSize="@dimen/news_detail_date_height" android:textColor="@color/font_black" /> <Gallery android:id="@+id/news_detail_image" android:layout_height="wrap_content" android:layout_width="fill_parent" android:paddingTop="5dip" android:paddingBottom="5dip" /> <TextView android:id="@+id/news_detail_headline" android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center_horizontal" android:text="Some awesome headline" android:textSize="@dimen/news_detail_headline_height" android:textColor="@color/font_black" android:paddingTop="@dimen/news_detail_headline_paddingTop" android:paddingBottom="@dimen/news_detail_headline_paddingBottom" /> <TextView android:id="@+id/news_detail_content" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="Here comes a lot of text so the scrollview is really needed." android:textSize="@dimen/news_detail_content_height" android:textColor="@color/font_black" /> <!--- HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER. They should be positioned at the end of the content, so making the scrollview smaller is not an option. ----> </LinearLayout> </ScrollView> </LinearLayout> 

更新2我改变了标题,使其更容易理解(有一个downvote,哦!)。

您可能应该手动将项目添加到LinearLayout

 LinearLayout layout = ... // Your linear layout. ListAdapter adapter = ... // Your adapter. final int adapterCount = adapter.getCount(); for (int i = 0; i < adapterCount; i++) { View item = adapter.getView(i, null, null); layout.addView(item); } 

编辑 :当我需要显示约200个非平凡的列表项时,我拒绝了这种方法,它非常慢 – Nexus 4需要大约2秒来显示我的“列表”,这是不可接受的。 所以我转向Flo的方法与标题。 它工作得更快,因为列表视图是在用户滚动时按需创build的,而不是在创build视图时创build的。

简历:手动添加视图到布局更容易编码(因此潜在的移动部件和错误可能更less),但是会遇到性能问题,所以如果您有50个或更多视图,我build议使用标头方法。

例。 基本上活动(或片段)布局转换为这样的事情(不再需要ScrollView):

 <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_top_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"/> 

然后在onCreateView() (我将使用一个片段的例子),你需要添加一个头视图,然后设置一个适配器(我假设头资源ID是header_layout ):

 ListView listView = (ListView) inflater.inflate(R.layout.my_top_layout, container, false); View header = inflater.inflate(R.layout.header_layout, null); // Initialize your header here. listView.addHeaderView(header, null, false); BaseAdapter adapter = // ... Initialize your adapter. listView.setAdapter(adapter); // Just as a bonus - if you want to do something with your list items: view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // You can just use listView instead of parent casted to ListView. if (position >= ((ListView) parent).getHeaderViewsCount()) { // Note the usage of getItemAtPosition() instead of adapter's getItem() because // the latter does not take into account the header (which has position 0). Object obj = parent.getItemAtPosition(position); // Do something with your object. } } }); 

我会坚持标题视图解决scheme。 这没什么不好的 目前我正在使用完全相同的方法实施一项活动。

很明显,“物品部分”比静态物品更dynamic(可变物品数量与固定物品数量等),否则根本不会考虑使用适配器。 所以,当你需要一个适配器,然后使用ListView。

实现一个从适配器填充LinearLayout的解决scheme最终没有什么比用自定义布局构build一个ListView。

只是我2美分。

将你的视图设置为main.xml onCreate,然后从row.xml中膨胀

main.xml中

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="450dp" > <ListView android:id="@+id/mainListView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/size" android:layout_below="@+id/editText1" android:gravity="fill_vertical|fill_horizontal" android:horizontalSpacing="15dp" android:isScrollContainer="true" android:numColumns="1" android:padding="5dp" android:scrollbars="vertical" android:smoothScrollbar="true" android:stretchMode="columnWidth" > </ListView> <TextView android:id="@+id/size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:background="#ff444444" android:gravity="center" android:text="TextView" android:textColor="#D3D3D3" android:textStyle="italic" /> </EditText> </RelativeLayout> 

row.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="3dp"> <TextView android:id="@+id/rowTextView" android:layout_width="0dip" android:layout_height="41dp" android:layout_margin="4dp" android:layout_weight="2.83" android:ellipsize="end" android:gravity="center_vertical" android:lines="1" android:text="John Doe" android:textColor="@color/color_white" android:textSize="23dp" > </TextView> </LinearLayout>