1

Il y a d'autres problèmes liés à ceci mais ils ne traitent pas ma situation (leur code d'erreur a à voir avec une sorte de recyclage et/ou mauvais cast des appels par code client).

Ma situation est plus complexe.

J'ai un code où l'utilisateur peut tirer une bibliothèque de photos. Le truc, c'est que ça fonctionne très bien sur 7 téléphones que j'ai, tous les API fonctionnant 19+.

Cependant, j'ai un Google Nexus 4.3 qui exécute l'API 17. Et je reçois ce journal de panne qui n'a pas de mon code, seul le code de la bibliothèque. Si vous pouvez conseiller comment je pourrais être en mesure de coder un travail autour Je serais toutes les oreilles:

FATAL EXCEPTION: main 
    java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
      at android.widget.GridView.onMeasure(GridView.java:1042) 
      at android.view.View.measure(View.java:15848) 
      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:477) 
      at android.view.View.measure(View.java:15848) 
      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:477) 
      at android.view.View.measure(View.java:15848) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:15848) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
      at android.view.View.measure(View.java:15848) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189) 
      at android.view.View.measure(View.java:15848) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
      at android.view.Choreographer.doFrame(Choreographer.java:532) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
      at dalvik.system.NativeStart.main(Native Method) 

Mise à jour

Ma classe incriminée est la suivante:

//Special class that works with the UIL 
    //The holder gets re-used and gets the new properties from this 
    static class ReusableGridViewView extends FrameLayout 
    { 
     public ImageView imageView; 
     public ProgressBar progressBar; 

     public ReusableGridViewView(Context context) 
     { 
      super(context); 

      setLayoutParams(new LayoutParams((int)(0.325* ViewHelper.screenWidthPX(context)),(int)(0.325* ViewHelper.screenWidthPX(context)))); 

      imageView = new ImageView(context); 
      progressBar = new ProgressBar(context); 

      addView(imageView); 
      addView(progressBar); 
     } 
} 

Im en utilisant la bibliothèque Ultimate Image Loader et c'est le code qui utilise la classe ci-dessus.

//I do NOT call this directly, the listview decides when re use a convert view and passes it accordingly 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      final ViewHolder holder; 
      View view = convertView; 
      if (view == null) 
      { 
       view = new ReusableGridViewView(parent.getContext()); 

       holder = new ViewHolder(); 
       assert view != null; 
       holder.imageView = ((ReusableGridViewView)view).imageView; 
       holder.progressBar = ((ReusableGridViewView)view).progressBar; 
       holder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       view.setTag(holder); 
      } else { 
       holder = (ViewHolder) view.getTag(); 
      } 

      //System.out.println(" " + holder + " ||| " + holder.imageView); 
      ImageLoader.getInstance() 
        .displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() 
        { 
         @Override 
         public void onLoadingStarted(String imageUri, View view) 
         { 
          holder.progressBar.setProgress(0); 
          holder.progressBar.setVisibility(View.VISIBLE); 
         } 

         @Override 
         public void onLoadingFailed(String imageUri, View view, FailReason failReason) 
         { 
          holder.progressBar.setVisibility(View.GONE); 
         } 

         @Override 
         public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) 
         { 
          holder.progressBar.setVisibility(View.GONE); 
         } 

        }, new ImageLoadingProgressListener() 
        { 
         @Override 
         public void onProgressUpdate(String imageUri, View view, int current, int total) 
         { 
          holder.progressBar.setProgress(Math.round(100.0f * current/total)); 
         } 
        }); 

      //set all as unselected 
      ((ReusableGridViewView) view).removeSelectionBorder(); 
      for(int i = 0; i < SELECTED_IMAGES.length; i++) 
      { 
       if(SELECTED_IMAGES[i] == position) 
       { 
        //set cell to selected 
        ((ReusableGridViewView) view).addSelectionBorder(); 
       } 
      } 
      return view; 
     } 
+2

Pouvez-vous poster le code où vous obtenez cette exception? – Karthik

+0

Ill regarde mais aucun de ce code dans la pile est le mien :( – Aggressor

+0

essayez-vous de faire 'view.inflate' ou' infalter.inflate' n'importe où dans votre code? – Karthik

Répondre

5

Il se trouve que sur l'API < 17 FrameLayout ne peut pas être jeté correctement AbsListView params.

Ce que je n'ai mis AbsListView LayoutParams au lieu de FrameLayout params:

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