Thursday, June 13, 2013

GridView scroll - Android


I've a list of images in my app that needs to be shown in a Grid layout.. I've tried many ways to set height in Gridview layout, but all went in vain.. 

After too much of research, I stumbled on the excellent answer of Neil Traft.  I just copy-pasted his code in my app and it worked like a charm :)

ExpandableHeightGridView.java:

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.
            // But do not use the highest 2 bits of this integer; those are
            // reserved for the MeasureSpec mode.
            int expandSpec = MeasureSpec.makeMeasureSpec(
                    Integer.MAX_VALUE >> 2, 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;
    }
}

embed the GridView inside ScrollView as below,

<ScrollView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <RelativeLayout
        android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <com.droid.gview.ExpandableHeightGridView
       android:id="@+id/dashboard_grid"
       android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:horizontalSpacing="2dp"
    android:isScrollContainer="false"
    android:numColumns="2"
    android:stretchMode="columnWidth"
    android:verticalSpacing="20dp" />
</RelativeLayout>
</ScrollView>    

and lastly set the following,


ExpandableHeightGridView gridview = (ExpandableHeightGridView)  findViewById(R.id.dashboard_grid);
gridview.setExpanded(true);

No comments:

Post a Comment