yashhy
yashhy

Reputation: 3096

ClassCastException android.widget.AbsListView$LayoutParams to android.widget.GridLayout$LayoutParams is this exception specific to API level?

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);
    }
}

Upvotes: 2

Views: 2535

Answers (1)

Bryan Herbst
Bryan Herbst

Reputation: 67189

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.

Upvotes: 2

Related Questions