带有ListView的ScrollView不会滚动 - android

时间:2013-02-05 07:59:58

标签: android android-layout android-listview scroll android-scrollview

我的以下布局的问题是布局不滚动。我的要求是我必须显示2个有时可能很大的列表。所以我将ListViews放在ScrollView中,这样我就可以滚动到底部并查看ListViews。 I don't want the ListView to scroll。我只希望我的ScrollView能够正常运行。有什么建议??

<?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>

6 个答案:

答案 0 :(得分:14)

我花了几天时间试图弄清楚如何实现这个目标并且无法找到任何解决方案。 You should not put a ListView inside a ScrollView 是我搜索过的地方常见的说法。我不想使用LinearLayout或ViewGroup,因为我已经使用ListView创建了整个UI,它对我和其他所有人来说都很棒。除了页面没有滚动之外,它运作良好。

最近我在这里偶然发现了一个问题并试着试试这个问题。它完美无缺!

以下是解决方案:

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);
    }
}

在将适配器分配到列表视图后,只需致电Utility.setListViewHeightBasedOnChildren(yourListView),即可完成!

非常感谢DougW提出答案。这是原始链接How can I put a ListView into a ScrollView without it collapsing?

答案 1 :(得分:3)

你不应该将listview放到scrollview中,这不是一个好主意。如果您不希望它滚动,也许您不应该使用listviews。你尝试过LinearLayouts吗?

答案 2 :(得分:1)

您可以使用一个列表视图而不是放置两个列表视图,您可以添加两个数据或在该列表视图的适配器中对两个xml文件进行充气。这将在一个列表视图中显示两个数据,并使用一个滚动条滚动数据。

答案 3 :(得分:1)

在调用以下方法之前,

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);
    }

您必须从scrollview中删除属性'android:fillViewport =“true”。如果没有,滚动不起作用。

答案 4 :(得分:0)

尝试这种方式:

您从布局中删除了滚动视图,因为这对列表视图无法正常工作..

并且您还为listview设置了高度"android:layout_height="fill_parent",以便占据父布局的完整高度。

所以请为listview手动修复一些高度。

答案 5 :(得分:0)

找到解决方案只需添加:

android:nestedScrollingEnabled="true"

到列表视图:3

            <ListView
                android:id="@+id/ListViewPrzebiegTrasy"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:visibility="visible"
                android:scrollbars="vertical"
                android:nestedScrollingEnabled="true">
            </ListView>