Question

I am creating an image gallery in android similar to the following: image gallery

I am using Gridlayout as main layout and Linearlayouts for items. This is how I am doing it:

//this is a method that returns a polaroid tile that I add in gridlayout
public LinearLayout ConstructAlbumGridLinearLayout(final int id) {

        LinearLayout albumLayout = new LinearLayout(
                context.getApplicationContext());
        RelativeLayout albumDetailsLayout = new RelativeLayout(
                context.getApplicationContext());
        TextView albumName = new TextView(context.getApplicationContext());
        TextView albumPicturesNumber = new TextView(
                context.getApplicationContext());
        LinearLayout pictureHolder = new LinearLayout(
                context.getApplicationContext());

        LinearLayout pictureRowOneHolder = new LinearLayout(
                context.getApplicationContext());
        LinearLayout pictureRowTwoHolder = new LinearLayout(
                context.getApplicationContext());

//this is the line, which throws an exception, even if I do wrap_content
//      albumLayout.setLayoutParams(new LayoutParams(100,
//              100));

        pictureRowOneHolder.setOrientation(LinearLayout.HORIZONTAL);
        pictureRowOneHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        pictureRowTwoHolder.setOrientation(LinearLayout.HORIZONTAL);
        pictureRowTwoHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        pictureHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        pictureHolder.setOrientation(LinearLayout.VERTICAL);

        albumLayout.setOrientation(LinearLayout.VERTICAL);

        albumDetailsLayout.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        RelativeLayout.LayoutParams rlName = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        rlName.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        albumName.setLayoutParams(rlName);
        albumName.setText("Family");

        RelativeLayout.LayoutParams rlSize = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        rlSize.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        albumPicturesNumber.setLayoutParams(rlSize);
        albumPicturesNumber.setText("3");

        for (int j = 0; j < 2; ++j) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    30, 30);
            ImageView albumPic = new ImageView(context.getApplicationContext());
            albumPic.setImageResource(R.drawable.movie1);
            albumPic.setLayoutParams(layoutParams);
            pictureRowOneHolder.addView(albumPic);
        }

        for (int j = 0; j < 2; ++j) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    30, 30);
            ImageView albumPic = new ImageView(context.getApplicationContext());
            albumPic.setImageResource(R.drawable.movie1);
            albumPic.setLayoutParams(layoutParams);
            pictureRowTwoHolder.addView(albumPic);
        }

        pictureHolder.addView(pictureRowOneHolder);
        pictureHolder.addView(pictureRowTwoHolder);

        albumDetailsLayout.addView(albumName);
        albumDetailsLayout.addView(albumPicturesNumber);

        albumLayout.addView(albumDetailsLayout);
        albumLayout.addView(pictureHolder);

        return albumLayout;

    }

Then I add this layout in my grid layout:

gl.addView(pictureGallery.ConstructAlbumGridLinearLayout(i));

This is my XML file:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:id="@+id/albumLinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/pictureType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My Albums"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <GridLayout 
        android:id="@+id/albumMainGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

I am not sure what wrong I am doing here... Is it the grid layout itself? Or the Linearlayout with the gridlayout proving to be a problem?

EDIT - Here is the exception:

02-13 20:11:28.250: E/AndroidRuntime(5040): FATAL EXCEPTION: main
02-13 20:11:28.250: E/AndroidRuntime(5040): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.GridLayout$LayoutParams
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.getLayoutParams1(GridLayout.java:729)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.validateLayoutParams(GridLayout.java:663)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.getLayoutParams(GridLayout.java:734)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:866)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.onMeasure(GridLayout.java:894)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:822)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2240)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1151)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2539)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.os.Looper.loop(Looper.java:137)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.app.ActivityThread.main(ActivityThread.java:4514)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at java.lang.reflect.Method.invokeNative(Native Method)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at java.lang.reflect.Method.invoke(Method.java:511)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at dalvik.system.NativeStart.main(Native Method)
Was it helpful?

Solution

From your Logcat it looks like you are casting a ViewGroup.LayoutParams class to a GridLayout.LayoutParams. This is a common issue when you call the constructor method of LayoutParams as you have:

albumLayout.setLayoutParams(new LayoutParams(100, 100));

You want to be specific with your LayoutParams, so if you are using a GridLayout, use GridLayout.LayoutParams and for LinearLayout use LinearLayout.LayoutParams etc. This stops the wrong version being picked up as you always want to use the parent Class of your ViewGroup.

In the example above, albumLayout is a GridLayout, so you want to use GridLayout.LayoutParams. Change that line to this:

albumLayout.setLayoutParams(new GridLayout.LayoutParams(100, 100));

You also have a couple of instances where you have LinearLayouts and a RelativeLayout that could do with the same change. (LinearLayout.LayoutParams and RelativeLayout.LayoutParams).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top