Aller au contenu

Changer les icones par des Bitmaps dans une ListView custom


BapNesS

Recommended Posts

Bonsoir/jour,

J'ai besoin d'un petit coup de main sur l'application (plus sérieuse que ma dernière en date :-D) sur laquelle je travaille actuellement.

J'utilise une ListView custom de ce type :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="?android:attr/listPreferredItemHeight"
   android:padding="6dip">
   <ImageView
       android:id="@+id/icon"
       android:layout_width="wrap_content"
       android:layout_height="fill_parent"
       android:layout_marginRight="6dip"
       android:src="@drawable/icon" />
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="0dip"
       android:layout_weight="1"
       android:layout_height="fill_parent">
       <TextView
           android:id="@+id/toptext"
           android:layout_width="fill_parent"
           android:layout_height="0dip"
           android:layout_weight="1"
           android:gravity="center_vertical"
       />
   </LinearLayout>
</LinearLayout>

L'affichage souhaité ressemble un peu à ça :

screen1.png

Cependant, je souhaite remplacer les icônes par les bitmaps que j'ai stockés dans une ArrayList. Je ne sais pas comment faire car les icônes sont censées être des ressources.

J'ai lu quelques solutions parlant d'ImageBinder mais je ne vois pas trop comment l'utiliser dans mon adapter :

adapter.addSection("Derniers articles",
new SimpleAdapter(this,
Map<String, String>,
R.layout.list_complex_extra,
new String[] { ITEM_TITLE, ITEM_BMP },
new int[] { R.id.list_complex_title, R.id.list_complex_bmp }));

Références :

J'ai essayé d'illustrer un maximum mon code pour avoir un peu d'aide. Merci. :]

Lien vers le commentaire
Partager sur d’autres sites

Il n'y a pas possibilité de passer les bitmaps en argument de l'Adapter ?

Sinon, je penser passer par setImageBitmap() en effet mais comment boucle sur les items de la liste ?

Merci.

EDIT

Je viens de trouver la fonction getChildAt(int id) : View dans la class ListView. Je pense que ça va faire l'affaire.

Lien vers le commentaire
Partager sur d’autres sites

LinearLayout ll;
ImageView imageview;
for (int i = 1 ; i <= this.ImageLibs.length ; i++)
{
ll = (LinearLayout) adapter.getView(i, null, null);
imageview = (ImageView) ll.getChildAt(0);
imageview.setImageBitmap(this.ImageBitmaps[i-1]);
}

En effectuant une modification de la sorte, ça ne fonctionne toujours pas…

Lien vers le commentaire
Partager sur d’autres sites

Je pense que tu prends le problème du mauvais côté.

Ce n'est pas à toi d'itérer sur tes éléments pour renseigner la ListView, c'est celle-ci qui s'en charge. De plus, une ListView n'a qu'un nombre limité de vues filles (correspondant grosso modo à ce qu'elle peut afficher à l'écran), et fait donc du recyclage de vue pour afficher au fur et à mesure les éléments en fonction du scroll.

Dans ton cas, je pense qu'il faudrait que tu définisses ton propre Adapter, dérivé de ArrayAdapter par ex., en lui fournissant un ensemble d'objets contenant tes données, et en implémentant la méthode getView

Ce qui donnerai:

public class MonAdapter extends ArrayAdapter<MonObjet>
{
   public MonAdapter(Context context, int resourceId)
   {
      super(context, resourceId);
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent)
   {
       View result = convertView;
       MonObjet monObjet = getItem(position);

       if (convertView == null)
       {
         result = LayoutInflater.from(getContext()).inflate(R.layout.list_complex_extra, parent, false);
       }
       TextView toptext = (TextView)result.findViewById(R.id.toptext);
       toptext.setText( monObjet.getMaValeur() );

       ImageView imageview = (ImageView)result.findViewById(R.id.icon);
       imageview.setImageBitmap( monObjet.getMaBitmap() );

       return result;
    }
}

avec la classe MonObjet qui permet de contenir les informations pour une ligne de ta liste

public class MonObjet
{
   private String maValeur;
   private ImageBitmap maBitmap;

   public String getMaValeur() { return maValeur; }
   public ImageBitmap getMaBitmap() { return maBitmap; }

   public MonObjet(String pValeur, ImageBitmap pBitmap)
   {
     maValeur = pValeur;
     maBitmap = pBitmap;
   }
}

Ensuite dans le onCreate de ton Activity:

 ...
 MonAdapter adapter = new MonAdapter(this, R.layout.list_complex_extra);
 // Ajout des éléments dans la liste
 adapter.add(new MonObjet("Premier element", ImageBitmaps[0]) );
 ... etc
 setListAdapter(adapter);
 ...

Et ça devrait marcher (sous réserve de faute de frappe de ma part...)

Lien vers le commentaire
Partager sur d’autres sites

Tu t'es bien cassée la tête pour m'aider. Je te remercie.

J'ai bien compris le problème et tenterai ta solution des que possible. Merci.

EDIT

Ok, ça marche impeccablement. Merci pour le coup de main. Je comprends mieux le principe aussi, c'est presque le plus important.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...