Search code examples
androidxmlgridviewscrollview

ScrollView collapsing GridViews


I have the following layout:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Test">


<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:orientation="horizontal">
            <TextView
                .../>
            <TextView
                .../>
        </LinearLayout>

        <GridView
            android:id="@+id/gridview_matrici"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:numColumns="3"
            android:padding="0dp"
            android:background="#ffffff"
            android:horizontalSpacing="3dp"
            android:verticalSpacing="3dp"
            android:stretchMode="columnWidth" >
        </GridView>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:orientation="horizontal">
            <TextView
                .../>
            <TextView
                .../>
        </LinearLayout>

        <GridView
            android:id="@+id/gridview_soluzioni"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:numColumns="4"
            android:padding="0dp"
            android:background="#ffffff"
            android:horizontalSpacing="3dp"
            android:verticalSpacing="3dp"
            android:stretchMode="columnWidth" >
        </GridView>
    </LinearLayout>
</ScrollView>

when I add the ScrollView the GridView are collapsed, showing only one row.
I tried them all but I can not solve the problem.
Can you tell me what to do?
Thanks in advance!



(It says that it looks like my post is mostly code, but what else can I say? The code explain all the problem!)


Solution

  • Use android.support.v4.widget.NestedScrollView instead of ScrollView

    Change ScrollView, LinearLayout (which is direct child of ScrollView) height to wrap_content

    Add this class in your project:

    public class ExpandableHeightGridView extends GridView
    {
    
        boolean expanded = false;
    
        public ExpandableHeightGridView(Context context)
        {
            super(context);
        }
    
        public ExpandableHeightGridView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }
    
        public ExpandableHeightGridView(Context context, AttributeSet attrs,
                int defStyle)
        {
            super(context, attrs, defStyle);
        }
    
        public boolean isExpanded()
        {
            return expanded;
        }
    
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            // HACK! TAKE THAT ANDROID!
            if (isExpanded())
            {
                // Calculate entire height by providing a very large height hint.
                // View.MEASURED_SIZE_MASK represents the largest height possible.
                int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
                        MeasureSpec.AT_MOST);
                super.onMeasure(widthMeasureSpec, expandSpec);
    
                ViewGroup.LayoutParams params = getLayoutParams();
                params.height = getMeasuredHeight();
            }
            else
            {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    
        public void setExpanded(boolean expanded)
        {
            this.expanded = expanded;
        }
    }
    

    Include it in your layout like this:

    <com.example.ExpandableHeightGridView
        android:id="@+id/myId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:horizontalSpacing="2dp"
        android:isScrollContainer="false"
        android:numColumns="4"
        android:stretchMode="columnWidth"
        android:verticalSpacing="20dp" />
    

    Lastly you just need to ask it to expand:

    mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId);
    mAppsGrid.setExpanded(true);