Un problème rencontré lors de mes différents développements à été d’afficher des images provenant d’un champs Blob(SQlite) dans une zone image d’une listView.
Pour se faire, il faut tout d’abord créer une classe que j’appellerai ici « MyViewBinder », en voici donc le code :
import android.graphics.Bitmap; import android.view.View; import android.widget.ImageView; import android.widget.SimpleAdapter.ViewBinder; public class MyViewBinder implements ViewBinder { public boolean setViewValue(View view, Object data,String textRepresentation) { if( (view instanceof ImageView) & (data instanceof Bitmap) ) { ImageView iv = (ImageView) view; Bitmap bm = (Bitmap) data; iv.setImageBitmap(bm); return true; } return false; } }
Il faut ensuite déclarer classiquement un HashMap mais de la façon suivante :
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>(); //Déclaration de l'ArrayList qui recevra la liste de HashMap HashMap<String, Object> map; //Déclaration du HashMap map = new HashMap<String, Object>();
Vous pouvez ensuite y insérer l’image stocker dans un Bitmap de la façon suivante :
Le tout devra donc être dans un boucle pour remplir les différentes case de la listView
image = c.getBlob(3); //Récupération du Blob bmp = BitmapFactory.decodeByteArray(image,0,image.length, null); //Conversion en Bitmap map.put("img",bmp); //Mettre l'image dans le HashMap listItem.add(map); //Mettre chaque HashMap dans l'ArrayList
Et enfin, l’affichage de tout cela
SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem,R.layout.affichageitem, new String[] {"img", "ville", "type","prix","id"}, new int[] {R.id.img, R.id.ville, R.id.type,R.id.prix,R.id.id}); mSchedule.setViewBinder(new MyViewBinder()); listView.setAdapter(mSchedule);
Bien sûr, ce fonctionne marche également très bien pour les images provenant d’URLs externe.