2016-10-18 1 views
-1

Je veux remplir mon recyclerview avec petit (60x60) bitmap d'art d'album, mais je ne peux pas sembler l'obtenir. J'ai essayé tout ce que je savais, aidez s'il vous plaît.decodeStream ne remplit pas recyclerView avec l'image bitmap

Le code que je utilise pour réduire les images:

public static int calculateSize(BitmapFactory.Options opt, int reqHeight, int reqWidth){ 
     int height = opt.outHeight; 
     int width = opt.outWidth; 
     int inSampleSize = 1; 

     if(height > reqHeight || width > reqWidth){ 

      final int halfWidth = width/2; 
      final int halfHeight = height /2; 

      while((halfHeight/inSampleSize) >= reqHeight && (halfWidth/inSampleSize) >= reqWidth){ 
       inSampleSize *= 2; 

      } 
     } 

     return inSampleSize; 
    } 

    public Bitmap decodeSampleBitmapFromArray(InputStream stream, Rect rect, int reqHeight, int reqWidth){ 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     Bitmap bit = BitmapFactory.decodeStream(stream, rect, options); 

     //Calculate sample size 
     options.inSampleSize = calculateSize(options, reqHeight, reqWidth); 

     //Decode bitmap with insamplesize set false 
     options.inJustDecodeBounds = false; 
     return bit; 
    } 

Alors j'appelle la fonction decodeSampleBitmapFromArray dans ma méthode onCreate pour remplir mon adaptateur recyclerview:

@Override 
public void onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 
... 

    adapter = new CustomRecycler(paths); 
    recyclerView = (RecyclerView)v.findViewById(R.id.ryc); 

    lManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(lManager); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(adapter); 
     metaRetriever.setDataSource(path); 
     byte[] b = metaRetriever.getEmbeddedPicture(); 

     if (b != null) { 
      InputStream in = new ByteArrayInputStream(b); 
      paths.add(decodeSampleBitmapFromArray(in,new Rect(-1,-1,1,1), 60, 60)); 

     }else{ 
      Bitmap altIcon = BitmapFactory.decodeResource(getResources(), R.drawable.beat); 
      paths.add(altIcon); 
     } 

} 

Mon RecyclerAdapter puis a reçu le bitmap et l'affiche en utilisant ImageView

holder.artImage.setImageBitmap(mImage.get(position)); 

Après faire tout cela, les images ne peuplent toujours pas le recyclerview. Qu'est-ce que je fais mal? Merci d'avance

+0

CustomRecycler ne connaît que les chemins vides ... il n'était pas informer que le contenu avait changé – Selvin

+0

Je l'ai dans mon projet, mais je l'ai omis par erreur lors de la publication de ce code. – DevMike

+0

* les images ne peuplent toujours pas le recyclerview * est trompeur ... il est difficile de deviner s'il n'y a pas au moins des espaces réservés ou si les images ne sont pas en train de charger ... aussi je ne vois pas de code de débogage "bitmap is null" message) – Selvin

Répondre

2

Lorsque vous définissez options.inJustDecodeBounds = true, c'est exactement ce qui se passe — il décode juste les limites. Null est toujours renvoyé pour l'image bitmap. L'idée est qu'une fois que vous connaissez les limites, vous pouvez définir options.inSampleSize à une valeur appropriée et décoder les données d'image à nouveau.

Examinez attentivement la méthode decodeSampleBitmapFromResource de cette page développeur: https://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap

BitmapFactory.decodeResource est appelé deux fois, d'abord avec options.inJustDecodeBounds = true pour obtenir les dimensions, puis avec options.inSampleSize ensemble pour produire une image bitmap mise à l'échelle de la façon dont vous voulez.

Votre code fait la bonne chose pour obtenir une valeur pour options.inSampleSize, sauf que vous n'appelez jamais BitmapFactory.decodeStream() avec cette valeur pour récupérer le bitmap mis à l'échelle.

+0

Merci, votre explication a résolu le problème. – DevMike