ScrollView with a ListView doesn't scroll - android

12,434

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

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

Solution 3

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.

Solution 4

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.

Share:
12,434

Related videos on Youtube

Vikram Gupta
Author by

Vikram Gupta

Technology attracts me; I'm a tech freak and a pretty nice coder as well. I love building Android apps. Soccer is an integral part of my life; something I can't live without. I also take pleasure in biking and outdoor activities to keep myself fit, and photography. I love cooking and I'm pretty good at that too! Connect with me on: LinkedIn - https://www.linkedin.com/in/vikramgupta20 Twitter - @vikram_gupta

Updated on June 23, 2022

Comments

  • Vikram Gupta
    Vikram Gupta over 1 year

    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>
    
  • Bhavinkumar Patel
    Bhavinkumar Patel almost 8 years
    Thank you very much u saved my day

Related