问题
My problem with the following layout is that the layout doesn't scroll. My requirement is that I have to display 2 lists which at times can be big. So i put both the ListViews inside a ScrollView so that i can scroll to the bottom and have a look at both the ListViews. I don't want the ListView to scroll
. I only want my ScrollView to behave as it should. Any suggestions??
<?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:orientation="vertical" >
<ScrollView
android:id="@+id/scrollViewContactDetails"
android:layout_width="match_parent"
android:layout_height="fill_parent" android:fillViewport="true">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="22dp" />
<LinearLayout
android:id="@+id/numbersLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="vertical"
android:weightSum="1" >
<LinearLayout
android:id="@+id/numbersLayoutList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical"
android:weightSum="1" >
<ListView
android:id="@+id/numbersList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:dividerHeight="2dp" >
</ListView>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/emailLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:weightSum="1" >
<LinearLayout
android:layout_width="120dp"
android:layout_height="match_parent"
android:layout_gravity="right|center"
android:gravity="top|right"
android:orientation="vertical" >
<TextView
android:id="@+id/emailId"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="right|center"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#8d8d8d"
android:textSize="18dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/emailLayoutList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="20dp"
android:gravity="center"
android:orientation="vertical"
android:weightSum="1" >
<ListView
android:id="@+id/emailList"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:dividerHeight="2dp" >
</ListView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
回答1:
I spent days trying to figure out how to achieve this and couldn't find any solution. You should not put a ListView inside a ScrollView
was the common saying everywhere I searched. I didn't want to use LinearLayout or ViewGroup because I had already created the whole UI using ListView and it looked awesome to me and everyone else. It worked well except that the page didn't scroll.
Recently I stumbled upon a question here and thought to give this answer a try. It works flawlessly!
Here's the solution:
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
Just call Utility.setListViewHeightBasedOnChildren(yourListView)
after you have assigned the adapter to your listview and you're done!
A big thanks to DougW
for coming up with the answer. Here is the original link How can I put a ListView into a ScrollView without it collapsing?
回答2:
You shouldn't put listview in to scrollview, it's not a good idea. If you don't want it to scroll, maybe you shouldn't use listviews. Have you tried with LinearLayouts?
回答3:
Instead of putting two listview you can use one listview and you can add both data or inflate both xml file in the adapter of that listview. This will show both data in one listview and scroll the data with one scroll bar.
回答4:
Before calling the below method,
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
You must remove the property 'android:fillViewport="true" from scrollview. If not, scrolling not works.
回答5:
Try this way:
You removed scroll view from your layout because that is not working correctly for list view..
And also you put the height "android:layout_height="fill_parent"
for listview so that is occupy full height of parent layout.
so please fix some height manually for both listview.
来源:https://stackoverflow.com/questions/14702650/scrollview-with-a-listview-doesnt-scroll-android