IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

setImageBitmap dans une customListView


Sujet :

Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 24
    Points
    24
    Par défaut setImageBitmap dans une customListView
    Bonjour à tous !

    J'ai un petit soucis (encore une fois ! ). J'ai crée une customlistview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="5dp" >
     
        <!-- Thumbnail Image à gauche -->
     
        <LinearLayout
            android:id="@+id/thumbnails"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true" >
     
     
            <ImageView
                android:id="@+id/thumbnail"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:paddingRight="5dp"
                android:src="@drawable/thumb" />
     
        </LinearLayout>
     
        <!-- Localité -->
     
        <TextView
            android:id="@+id/Lieu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/thumbnails"
            android:layout_toRightOf="@+id/thumbnails"
            android:textColor="#000000"
            android:textSize="22dp"
            android:typeface="normal" />
    Alors Premièrement, je n'arrive pas à faire un changement de couleur lorsque l'objet est pressé, j'ai tout essayé ce que j'ai trouvé sur le net, entre autre list_selector, ...

    Et deuxièmement, je souhaiterai attribuer à chaque objet un thumbnail propre à lui. Je crois que j'ai tout essayé ce qui me passait par la tête, mais j'arrive pas à avoir de résultat :p

    Voilà le code de mon Main pour la création de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public View  getView(int position, View  convertView, ViewGroup parent) {
        	  View  view = getView(position, convertView, parent);
     
        	  int color1 = 0xaaCECECE;
        	  int color2 = 0xaa2F67FF;
        	  if(position % 2 == 0)
        		  view.setBackgroundColor(color1);
        	  else
        		  view.setBackgroundColor(color2);
     
        	  return view;
        	}
     
        	public class SpecialAdapter extends SimpleAdapter {
        		//private int[] colors = new int[] { 0x30CECECE, 0x30FFFFFF };
     
        		public SpecialAdapter(Context context, List<HashMap<String, String>> items, int resource, String[] from, int[] to) {
        			super(context, items, resource, from, to);
        		}
     
        		@Override
        		public View getView(int position, View convertView, ViewGroup parent) {
     
        		  View view = super.getView(position, convertView, parent);
            	  int color1 = 0xaaCECECE;
            	  int color2 = 0xaaFFFFFF;
            	  if(position % 2 == 0)
            		  view.setBackgroundColor(color1);
            	  else
            		  view.setBackgroundColor(color2);
     
            	  Id = ((TextView) view.findViewById(R.id.Id)).getText().toString();
            	  System.out.println("id = " + Id);
            	  File filethumb = new File("/mnt/sdcard/360ViewerApp/Immo" + Id + "/Thumbnail/");
            	  System.out.println("filethumb = " + filethumb);
            	  ListDirectory(filethumb, fileThumb);
            	  System.out.println("Thumnail = " + fileThumb.get(0));
            	  Bitmap thumb = BitmapFactory.decodeFile(fileThumb.get(0));
     
            	  System.out.println("ImageView = " + thumbnail);
     
            	  thumbnail.setImageBitmap(thumb);
     
        		  view.setOnClickListener(new OnClickListener() {
     
    				...
     
    			});
    Voilà comment je récupère le thumbnail qui est défini dans list_item.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            LayoutInflater factory = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     
            View imageViewThumbnail = factory.inflate(R.layout.list_item, null);
     
            thumbnail = (ImageView)imageViewThumbnail.findViewById(R.id.thumbnail);

    Et la définition de ma liste dans le main.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            <ListView
                android:id="@android:id/list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:cacheColorHint="@android:color/white"
                android:divider="@android:drawable/screen_background_light"
                android:visibility="visible"
                android:listSelector="@android:color/black">
     
            </ListView>

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Déjà le code tel qu'il est posté ne compile pas.... Le type "Id" n'est pas défini... et dans la ligne "Id = ((TextView) view.findViewById(R.id.Id)).getText().toString();" il manque le nom de la variable, et on essaye de lui passer un String (ce qui ne marchera certainement pas).
    Pareil pour "thumbnail" déclaré nulle part...
    Pareil pour le type "ListDirectory" ...
    Pas de retour de "view" dans getView()....

    A moins que Id soit un String déclaré globalement... dans ce cas:
    1. Si c'est une variable, elle doit commencer par une minuscule
    2. Comme elle est utilisée dans une boucle (et n'est pas une valeur de retour) elle doit être déclarée dans la boucle (pour éviter les erreurs):

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    @Override
        		public View getView(int position, View convertView, ViewGroup parent) {
     
        		  View view = super.getView(position, convertView, parent);
                      int color = ((position % 2) == 0) ? 0xaaCECECE : 0xaaFFFFFF; // <= à passer en constantes quelque part (ou mieux en ressources, lues à l'instanciation de l'adapter)
                      view.setBackgroundColor(color);
     
            	  String id = ((TextView) view.findViewById(R.id.Id)).getText().toString();
                      // ici on va faire de l'IO... toujours protéger par un try/catch
                      try {
              	      File dirthumb= new File("/mnt/sdcard/360ViewerApp/Immo" + Id + "/Thumbnail/");
            	      Log.d("SpecialAdapter","looking for thumbnail in" + dirthumb);
                          // la fonction retourne un array de file, et ne doit pas avoir d'effets de bord (sinon danger !)
                          File[] thumblist = listImages(dirthumb);
                          // on se protège (toujours)
                          if (thumblist != null && thumblist.length > 0) {
                               File thumbfile = thumblist[0];
                               Log.i("SpecialAdapter","reading thumbnail from "+thumbfile);
                               Bitmap thumb = BitmapFactory.decodeFile(thumbfile);
                               ImageView iv = (ImageView) view.findViewById(R.id.thumbnail);
                               iv.setImageBitmap(thumb);
                          } else {
                               Log.i("SpecialAdapter", "no thumbnail found for "+id);
                      } catch (Exception ex) {
                          Log.w("SpecialAdapter","Error while getting thumbnail for "+id,ex);
                      }
     
                      return view;
                 }
    Je ne comprends pas ton code avec l'inflater... l'ImageView est crée par le super.getView() (enfin... crée ou réutilisée...) pourquoi en refaire une ?
    Et il est ou ce code ?

    D'autre par le setOnClickListener() ne sert à rien... il faut utiliser la fonction setOnItemClickListener() de la ListView ....


    Pour finir, LINT ne dit rien à propos de l'ImageView et du TextView ? Parceque normalement, tout TextView est capable d'avoir une image associée (c'est comme cela que sont fait les checkbox).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Le code ne compile pas, c'est parce que j'ai plus de 1000 lignes et j'ai fait un petit résumé.
    Alors ListDirectory est une fonction qui me permet de répertorier tous les fichiers présents dans un répertoire.
    thumbnail est bien declaré.
    je retourne bien la vue à la fin.
    Et enfin "Id" est une variable globale.

    En ce qui concerne le setOnClickListener(), j'ai suivi un tuto pour une custom listView et c'est tout simplement la façon dont il procédait ...

    Et pour l'inflater, c'est ce que j'ai pu trouver sur le net, en cherchant comment récuperer une vue qui appartient à un autre fichier XML.

    Mon code effectue bien les opérations que je voulais effectuer, mise à part le setImageBitmap pour les thumbnails, et le changement de couleur lors du "onPress" j'ai fait les affichages console et toutes les variables ont la valeur qu'elles doivent avoir.

    je débute avec Android, j'imagine bien que mon code n'est pas vraiment optimal (même pas du tout d'après ce que tu viens de dire), c'est en faisant des erreurs qu'on apprend ! :p

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par fullmetalkeke Voir le message
    Alors ListDirectory est une fonction qui me permet de répertorier tous les fichiers présents dans un répertoire.
    Si c'est une fonction elle doit s'appeler "listDirectory" alors....
    La fonction devrait alors retourner un tableau ... (dans le cas présent, je ne sais pas ce qu'elle fait: fileThumb n'étant pas déclaré)... D'autre part... pas facile à la lecture de faire la différence entre fileThumb, filethumb... Les deux d'après leur nom sont sensé être des fichiers de thumbnails... l'un est un répertoire (donc non), l'autre une liste de File (donc non aussi)
    D'ou dans mon code le remplacement par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    File[] thumblist = listImages(dirthumb);
    Le codage est simple à priori:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    File[] listImages(File dir)
    {
        String[] filenames = dir.list(new ImageFilter());
        File[] ret = new File[filenames.length];
        for (int i = 0; (i < filenames.length); ++i) 
             ret[i] = new File(dir,filenames[i]);
        return ret;
    }
    Et enfin "Id" est une variable globale.
    Comme elle change à chaque occurence de l'appel à getView(), son 'scope' de validité est limité à cette fonction, pour s'éviter des problèmes il faut donc que son 'scope' syntaxique soit aussi limité à la fonction => déclaration dans la fonction getView()
    Et comme c'est une variable "id" doit être son nom: Seuls les types java (class,enum,interface) commencent par une majuscule.

    En ce qui concerne le setOnClickListener(), j'ai suivi un tuto pour une custom listView et c'est tout simplement la façon dont il procédait ...
    Aucun interêt... setOnItemClickListener() sur la ListView !

    Et pour l'inflater, c'est ce que j'ai pu trouver sur le net, en cherchant comment récuperer une vue qui appartient à un autre fichier XML.
    ???? Je comprends pas... tu le fais déjà pour le textview, c'est la même chose pour l'imageview (regardes mon code).
    La "ListView" recoit un adapter.. ELLE va appeler l'adapter.getView(...) pour chaque item (de l'adapter) à afficher. Le SimpleAdapter.getView() va faire l'inflate du layout et retourner la top-most view (le RelativeLayout) du layout passé en paramètre.
    Il suffit de faire un findViewById sur ce RelativeLayout pour trouver l'ImageView comme le TextView...

    Dans ton code, je ne sais pas comment est initialisé 'thumbnail'.... mais il m'est d'avis qu'il correspond à un objet 'inflaté' ailleurs et pas dans la hierarchie des vues affichées....

    Mon code effectue bien les opérations que je voulais effectuer, mise à part le setImageBitmap pour les thumbnails, et le changement de couleur lors du "onPress" j'ai fait les affichages console et toutes les variables ont la valeur qu'elles doivent avoir.
    A priori non puisque la fonction getView() ne marche pas du tout comme escompté.... (c'est celle de SimpleAdapter qui marche).

    Pour le background, tu définis explicitement le background à une couleur (en fonction de la position), donc il ne risque pas de changer sur un 'onPress'...
    Il y a deux possibilité:
    * Faire tout une tringlerie avec les états... mettre l'état "IMPAIR" (par exemple) une ligne sur deux dans le getView, et utiliser tout le temps le même selector de couleur (dans le layout).
    * Utiliser deux selectors de couleurs pour le background, et choisir l'un ou l'autre en fonction de la position dans le getView.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Ca date un peu, mais j'avais plus vraiment le temps de bosser dessus.
    Mais grâce à tes conseils, j'ai pas mal restructuré mon code et j'ai réussi à m'en sortir plutôt bien.
    Du clos je clos la discussion, et je te remercie encore une fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  3. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39
  4. Réponses: 3
    Dernier message: 09/05/2002, 01h39
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo