2

I'm trying to add LinearLayout dynamically(inflating) to a GridLayout as mentioned in the picture below. GridLayout is static inside a ListView "row" layout.

When i try to add LinearLayout to the GridLayout I get an error :

09-01 12:55:54.320: E/AndroidRuntime(4156): FATAL EXCEPTION: main
09-01 12:55:54.320: E/AndroidRuntime(4156): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams cannot be cast to android.widget.GridLayout$LayoutParams
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.GridLayout.getLayoutParams1(GridLayout.java:729)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.GridLayout.validateLayoutParams(GridLayout.java:663)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.GridLayout.getLayoutParams(GridLayout.java:734)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:866)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.GridLayout.onMeasure(GridLayout.java:894)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.ListView.measureScrapChild(ListView.java:1181)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1246)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.ListView.onMeasure(ListView.java:1155)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1451)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4706)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2261)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.View.measure(View.java:12922)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1255)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2649)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.os.Looper.loop(Looper.java:137)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at android.app.ActivityThread.main(ActivityThread.java:4507)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at java.lang.reflect.Method.invokeNative(Native Method)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at java.lang.reflect.Method.invoke(Method.java:511)
09-01 12:55:54.320: E/AndroidRuntime(4156):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)

As mentioned in the stack trace, AbsListView$LayoutParams cannot cast to GridLayout$LayoutParams. I don't know why this happens?

NOTE : The most weird part is its happening only in 4.0.4 API 15 devices. It works good in 4.3 and 4.4

version_4.0.4_api_15

Update : (Sample Code)

viewHolder.gridLayout1 = (GridLayout) getView().findViewById(R.id.sampleGridLayout);
setLinear(viewHolder);

private void setLinear(ViewHolder viewHolder) {
    viewHolder.gridLayout1.removeAllViews();

    for (int i = 0; i < 3; i++) {
        LinearLayout matchLayout = (LinearLayout) viewHolder.inflater.inflate(R.id.sampleLinear, parent, false);
        //view populations in matchLayout

        viewHolder.gridLayout1.addView(matchLayout);
    }
}
5
  • posted sample code @Prag'sシ Commented Sep 4, 2014 at 13:10
  • What type of View is the parent that you pass to viewHolder.inflater.inflate()? Commented Sep 4, 2014 at 13:42
  • are you using layoutParams? Commented Sep 4, 2014 at 13:45
  • @Tanis.7x its a ViewGroup from getView(int position, View convertView, ViewGroup parent) Commented Sep 4, 2014 at 13:53
  • @Prag'sシ No, i'm not using layout params Commented Sep 4, 2014 at 13:54

1 Answer 1

2

The problem is that the parent ViewGroup that you are passing in to viewHolder.inflater.inflate(); is a ListView, not a GridLayout.

Since your adapter is being used to populate a ListView, the parent passed into getView(int position, View convertView, ViewGroup parent) will be a ListView.

When the LayoutInflater inflates your R.id.sampleLinear layout, it will give the inflated layout AbsListView.LayoutParams, because you are telling the inflater that you intend to put the layout in an AbsListView of some kind.

This will cause the error that you are receiving when you try to put that layout in a GridLayout instead, which requires all children to use GridLayout.LayoutParams.

On a side note, you should be passing a layout (in the form of R.layout.my_layout) instead of an ID (e.g. R.id.my_layout) to your inflater. I'm going to assume this is a typo because otherwise you would be getting a completely different exception.

Sign up to request clarification or add additional context in comments.

5 Comments

yeah I got your point! as mentioned in android docs developer.android.com/reference/android/view/…, android.view.ViewGroup, boolean), passing parent as second parameter and mentioning false in third parameter provides the parent layout params to its child which throws this error. But can justify why this happens in only API 15 devices? Because I already solved this by using matchLayout.setLayoutParams(new GridLayout.LayoutParams()); I wanted to know is this API specific?
Perhaps there was a bug in API 15 that allowed it to work. Unfortunately I really don't know why it would work in 15 (it shouldn't).
Thanks and the better approach would be to pass null in inflate()? like inflater.inflate(R.layout.sampleLinear, null);
That, or you could pass your GridLayout in as the parent instead
That't not possible in my case as the design would change.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.