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

Composants graphiques Android Discussion :

Modification d'une ImageView au sein d'une ListView


Sujet :

Composants graphiques Android

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Modification d'une ImageView au sein d'une ListView
    Bonjour,

    J'ouvre un second sujet pour un deuxième problème qui commence à me rendre un peu fou ^^;

    Le contexte est :
    - J'ai une Activity qui contient un ListView
    - Ce ListView est initialisé à l'aide d'un ArrayAdapter personnalisé
    - Chaque élément de la liste comportant une photo téléchargée sur internet, il est un peu long à afficher (100-150 éléments en moyenne) donc je souhaite les afficher avec une photo par défaut et ensuite, au sein d'une tâche asynchrone, télécharger les photos petit à petit et les mettre à jour dans la liste

    Element 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:orientation="horizontal" >
        <ImageView
            android:id="@+id/iBrPhoto"
            android:layout_width="65dp"
            android:layout_height="40dp"
            android:scaleType="fitXY"
            android:layout_marginRight="15dp"/>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:orientation="vertical" >
    	    <TextView
    	        android:id="@+id/tvTitle"
    	        android:layout_width="wrap_content"
    	        android:layout_height="22dp"
            	android:gravity="center_vertical"
            	android:textAppearance="@style/lv_chann_br_item_title" />
    	    <LinearLayout
    	        android:layout_width="wrap_content"
    	        android:layout_height="18dp"
    	    	android:orientation="horizontal" >
    		    <TextView
    		        android:id="@+id/tvHour"
    		        android:layout_width="wrap_content"
    		        android:layout_height="fill_parent"
            		android:gravity="center_vertical"
            		android:textAppearance="@style/lv_chann_br_item" />
    		    <TextView
    		        android:layout_width="wrap_content"
    		        android:layout_height="fill_parent"
            		android:gravity="center_vertical"
            		android:textAppearance="@style/lv_chann_br_item"
    		        android:text=" - " />
    		    <TextView
    		        android:id="@+id/tvType"
    		        android:layout_width="wrap_content"
    		        android:layout_height="fill_parent"
            		android:gravity="center_vertical"
            		android:textAppearance="@style/lv_chann_br_item" />
    		    <TextView
    		        android:layout_width="wrap_content"
    		        android:layout_height="fill_parent"
            		android:gravity="center_vertical"
            		android:textAppearance="@style/lv_chann_br_item"
    		        android:text=" - " />
    		    <TextView
    		        android:id="@+id/tvChannel"
    		        android:layout_width="wrap_content"
    		        android:layout_height="fill_parent"
            		android:gravity="center_vertical"
            		android:textAppearance="@style/lv_chann_br_item" />
    	    </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    Ma tâche Asynchrone
    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
     
        private class DownloadPhotoTask extends AsyncTask<Integer, Void, Bitmap> {
        	LinearLayout brView;
        	ImageView iv;
     
    		@Override
    		protected Bitmap doInBackground(Integer... params) {
    			Bitmap ret = null;
    			for (Integer index : params) {
    				View v = broadcastsListView.getChildAt(Integer.parseInt(index.toString()));
     
    				if (v == null) {
    					brView = new LinearLayout(getApplicationContext());
    					String inflater = Context.LAYOUT_INFLATER_SERVICE;
    					LayoutInflater vi = (LayoutInflater)getApplicationContext().getSystemService(inflater);
    					vi.inflate(R.layout.videos_broadcast_item, brView, true);
     
    				}
    				else {
    					brView = (LinearLayout)v;
    				}
     
    				ret = ImageUtils.LoadBitmap(ImageUtils.GetImageUrl(broadcasts.get(index).getPhotoId()), getApplicationContext());
    			}
    			return ret;
    		}
     
    		@Override
    		protected void onPostExecute(Bitmap bmp) {
    			iv = (ImageView)brView.findViewById(R.id.iBrPhoto);
    			Drawable[] layers = new Drawable[2];
    			layers[0] = new BitmapDrawable(bmp);
    			layers[1] = getApplicationContext().getResources().getDrawable(R.drawable.play_big);
    			layers[1].setBounds(10, 10, 10, 10);
    			LayerDrawable layerDraw = new LayerDrawable(layers);
    			iv.setImageDrawable(layerDraw);
    		}
    	}
    Le problème est que le téléchargement s'effectue bien... La mise à jour se fait sans soucis (j'ai testé sur les 10 premiers éléments)...

    MAIS !

    Quand je scrolle vers le bas, et que je remonte, les images ont disparues... et voila le noeud du problème >_<

    j'ai essayé de rajouter aaBr.notifyDataSetChanged(); à la fin de mon onPostExecute, mais ça se contente de ne rien m'afficher du tout...

    Je remercie par avance toute personne capable et voulant bien m'aider ^^

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Bonjour,

    Est ce que les images réapparaissent sur une autre ligne?

    J'ai eu un problème peut être similaire si c'est le cas dans l'un de mes tutoriels. Voici la réponse au final : http://www.developpez.net/forums/d11...s/#post6315941

    J'espere que cela peut t'aider

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Non, les images n'apparaissent pas ailleurs :/ elles disparaissent complètement

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    J'ai un peu du mal à comprendre ce bout de code.

    Qu'est ce que tu veux lui renvoyer exactement ?
    Car là tu lui renvoie l'image du dernier élément.

    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
    Bitmap ret = null;
    			for (Integer index : params) {
    				View v = broadcastsListView.getChildAt(Integer.parseInt(index.toString()));
     
    				if (v == null) {
    					brView = new LinearLayout(getApplicationContext());
    					String inflater = Context.LAYOUT_INFLATER_SERVICE;
    					LayoutInflater vi = (LayoutInflater)getApplicationContext().getSystemService(inflater);
    					vi.inflate(R.layout.videos_broadcast_item, brView, true);
     
    				}
    				else {
    					brView = (LinearLayout)v;
    				}
     
    				ret = ImageUtils.LoadBitmap(ImageUtils.GetImageUrl(broadcasts.get(index).getPhotoId()), getApplicationContext());
    			}
    			return ret;

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut
    Je renvoie l'image téléchargée (J'appelle une instance de DownloadPhotoTask pour chaque élément de ma ListView) qui est affichée dans le onPostExecute

    Si j'essaie d'afficher l'image directement dans le doInBackground, l'activity plante et me renvoie à l'Activity principale T_T

  6. #6
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 17
    Par défaut
    Je te conseille cette classe qui m'a beaucoup aidé pour ce genre de problématique de chargement d'images.

    Elle met en œuvre l'utilisation d'un cache mémoire de taille fixe, et un téléchargement très propre de l'image, avec entre autres la vérification qu'à la fin du chargement de l'image, l'imageView prévue au départ pour la recevoir n'est pas passée à autre chose. Car les vues sont réutilisées dans les listes, et comme ton asynctask est anormalement trop couplé avec tes vues et qu'il ne prend pas en compte ce paramètre, ce n'est pas étonnant que tu rencontres des problèmes.

    Il y a aussi un paramètre de vidage de cache au bout d'un certain délai.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2011, 18h01
  2. Faire une requête au sein d'une function
    Par Adorien dans le forum PL/SQL
    Réponses: 2
    Dernier message: 17/04/2009, 14h43
  3. Tester une valeur au sein d'une table
    Par titof90 dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/06/2007, 08h59
  4. L'affichage d'une photo au sein d'une page jsp
    Par debutantjak dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 10/05/2006, 17h11
  5. Insertion d'une Condition au sein d'une requete
    Par Redouane dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/02/2006, 10h58

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