2014-09-04 1 views
2

J'essaie d'ajouter LinearLayout dynamiquement (gonflant) à un GridLayout comme mentionné dans l'image ci-dessous. GridLayout est statique à l'intérieur d'une disposition en «rangée» ListView.

Lorsque je tente d'ajouter LinearLayout au GridLayout je reçois une erreur:

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) 

Comme mentionné dans la trace de la pile, AbsListView $ LayoutParams ne peut pas lancer GridLayout $ LayoutParams. Je ne sais pas pourquoi cela arrive?

NOTE: Le plus bizarre partie est sa passe que dans 4.0.4 API 15 périphériques. Il fonctionne bien dans 4.3 et 4,4

version_4.0.4_api_15

Mise à jour: (exemple de 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); 
    } 
} 
+0

postez votre code ... –

+0

exemple de code @ Prag's シ – yashhy

+0

Quel type de View est le 'parent' que vous passez à' viewHolder.inflater.inflate() '? –

Répondre

2

Le problème est que le parent ViewGroup que vous passez pour viewHolder.inflater.inflate(); est un ListView, non un GridLayout.

Étant donné que votre adaptateur est utilisé pour remplir un ListView, le parent passé en getView(int position, View convertView, ViewGroup parent) sera un ListView. Lorsque le LayoutInflater gonfle votre disposition R.id.sampleLinear, il donnera la disposition gonflée AbsListView.LayoutParams, parce que vous dites à l'inflateur que vous avez l'intention de mettre la disposition dans un AbsListView quelconque. Cela provoquera l'erreur que vous recevez lorsque vous essayez de mettre cette mise en page dans un GridLayout à la place, ce qui oblige tous les enfants à utiliser GridLayout.LayoutParams. Sur une note de côté, vous devriez passer une mise en page (sous la forme R.layout.my_layout) au lieu d'un identifiant (par exemple R.id.my_layout) à votre inflateur. Je vais supposer que c'est une faute de frappe, sinon vous auriez une exception complètement différente.

+0

ouais j'ai votre point! comme mentionné dans android docs http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup, booléen), en passant parent comme second paramètre et en mentionnant faux dans le troisième paramètre fournit les paramètres de mise en page parent à son enfant qui lance cette erreur. Mais peut justifier pourquoi cela se produit uniquement dans les appareils API 15? Parce que j'ai déjà résolu ceci en utilisant 'matchLayout.setLayoutParams (new GridLayout.LayoutParams());' Je voulais savoir si cette API était spécifique? – yashhy

+0

Il y avait peut-être un bogue dans l'API 15 qui lui permettait de fonctionner. Malheureusement, je ne sais vraiment pas pourquoi cela fonctionnerait en 15 (il ne devrait pas). –

+0

Merci et la meilleure approche serait de passer null dans inflate()? comme 'inflater.inflate (R.layout.sampleLinear, null); ' – yashhy

Questions connexes