2014-09-04 60 views
2

我正在尝试将LinearLayout动态地(充气)添加到GridLayout,如下图所示。 GridLayoutListView“行”布局内是静态的。

当我尝试添加LinearLayoutGridLayout我得到一个错误:

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) 

如堆栈跟踪中提到,AbsListView $的LayoutParams无法投射到网格布局$的LayoutParams。我不知道为什么会发生这种情况?

注:怪异部分是它的发生只在4.0.4 API 15个设备。它的工作原理好于4.3和4.4

version_4.0.4_api_15

更新:(示例代码)

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

发布您的代码... – 2014-09-04 13:05:47

+0

发布示例代码@Prag'sシ – yashhy 2014-09-04 13:10:49

+0

您传递给viewHolder.inflater.inflate()'的'parent'类型是什么类型? – 2014-09-04 13:42:43

回答

2

的问题是,parent ViewGroup中要传递到viewHolder.inflater.inflate();是一个ListView,不一个GridLayout。

由于您的适配器正用于填充ListView,因此传入getView(int position, View convertView, ViewGroup parent)parent将成为ListView。

当LayoutInflater膨胀你的R.id.sampleLinear布局时,它会给出膨胀的布局AbsListView.LayoutParams,因为你告诉inflater你打算把布局放在某种AbsListView中。

这会导致您在尝试将该布局放入GridLayout中时收到的错误,而这需要所有的孩子使用GridLayout.LayoutParams

请注意,您应该将布局(形式为R.layout.my_layout)而不是ID(例如R.id.my_layout)传递给您的充气器。我会认为这是一个错字,因为否则你会得到一个完全不同的例外。

+0

是的,我明白了你的观点!如android文档中提到http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int,android.view.ViewGroup,布尔),传递父母作为第二个参数,并提到第三个参数提供false父布局params给它的孩子抛出这个错误。但是可以证明为什么仅在API 15设备中发生这种情况?因为我已经通过使用'matchLayout.setLayoutParams(new GridLayout.LayoutParams())解决了这个问题;'我想知道这个API是特定的吗? – yashhy 2014-09-05 02:58:56

+0

也许API 15中存在一个允许它工作的错误。不幸的是,我真的不知道为什么它会在15(它不应该)。 – 2014-09-05 12:55:05

+0

感谢和更好的方法是在inflate()中传递null?像'inflater.inflate(R.layout。' – yashhy 2014-09-05 13:42:04

相关问题