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 :

Insérer une image téléchargée sur internet, dans une listView personnalisée


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut Insérer une image téléchargée sur internet, dans une listView personnalisée
    Bonjour à tous,

    Je me confronte aujourd'hui à un nouveau problème, après avoir passé l'après-midi dessus.
    Dans l'application que je développe, il y a une listeView "personnalisée" qui contient une image à gauche, deux editText au milieu, puis une autre image à droite.

    Mon problème est le suivant : l'image de gauche correspond à une image se trouvant sur internet.
    Pour éviter de rester trop longtemps bloqué, l'application affiche dans un premier temps la ListView avec une image par défaut, enregistré dans l'application.
    Dans un second temps, la ListView doit se réactualiser en affichant les images téléchargées. Et c'est là que ça coince.

    Code xml pour structure les éléments de la ListView (list_item.xml) : 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
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="1dp"
        android:background="#FFF"
        android:orientation="horizontal" >
     
        <ImageView
            android:id="@+id/itemImagePhoto"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true" />
     
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_toRightOf="@id/itemImagePhoto"
            android:orientation="vertical" >
     
            <TextView
                android:id="@+id/itemTexteNom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="1dp"
                android:paddingRight="46dp"
                android:textStyle="bold"
                android:textColor="#000"
                android:textAppearance="?android:attr/textAppearanceSmall" />
     
            <TextView
                android:id="@+id/itemTexteMarque"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="1dp"
                android:paddingRight="46dp"
                android:textColor="#000"
                android:textAppearance="?android:attr/textAppearanceSmall" />
     
        </LinearLayout>
     
     
     
        <ImageView
            android:id="@+id/itemImageNote"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true" />
     
    </RelativeLayout>


    Le remplissage de base, effectué par une AsyncTask "ProductsTask", se déroule correctement.
    Dans un ArrayList, j'enregistre un HashMap pour chaque produit (qui contient les couples clé/valeur pour remplir l'adapter selon img, nom, marque, et note).
    Dans ce premier remplissage, je met donc une image intégrée dans l'application, en attendant qu'une autre tâche télécharge les images sur internet. Cette image étant localisable via R.drawable.nom, il n'y a aucun problème avec cet adapter.

    Code du premier remplissage de la listView, par une AsyncTask : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*** Premier remplissage de la listView, par une AsyncTask ***/
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    ...
    SimpleAdapter adapter = new SimpleAdapter (context, list, R.layout.list_item,
    	new String[] {"img", "nom", "marque", "note"}, 
    	new int[] {R.id.itemImagePhoto, R.id.itemTexteNom, R.id.itemTexteMarque, R.id.itemImageNote});
    this.listView.setAdapter(adapter);

    Le problème survient peu après. Les images téléchargées sur internet sont sous la forme d'un objet "BitMap", alors que l'adapter souhaite un entier en paramètre, ciblant une ressource inscrite dans la classe R.

    Après avoir parcouru le site des ressources Android, et après quelques recherches et réflexion, j'ai pensé à quelques pistes : utiliser LayoutInflater, créé ma propre classe Adapter, créer ma propre classe ListView.
    Cependant, je ne suis à l'aise avec aucun de ces pistes, et c'est pourquoi j'aimerais avoir vos avis et conseils.
    Ou alors, peut-être faut-il procéder autrement ?

    Je vous remercie d'avance pour vos réponses.

  2. #2
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Oui... tu te crée une classe qui hérite de ImageView, capable de charger (en arriere plan) une image depuis internet.

    Ensuite il faut surcharger l'adapter (le SimpleAdapter), pour faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public View getView(int position, View convertView, ViewGroup parent) {
       ViewGroup vg = (ViewGroup) super.getView(position,convertView,parent);
       ((UrlImageView)vg.findViewById(R.id.itemImageNote)).setUrl(....);
       return vg;
    }
    Et voila, des images qui se chargent en background... Apres il faut optimiser avec un loader approprié...

  3. #3
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    Je viens d'essayer d'utiliser cette méthode, mais je dois me louper quelque part, parce que parfois les mêmes images Bitmap se dessinent alors que c'est impossible.

    Ma classe qui extends ImageView fait ça :
    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
    public void download(String URL){
    	new DownloadFilesTask(this).execute(URL);
    }
     
    public class DownloadFilesTask extends AsyncTask<String, Integer, Bitmap>{
    	private ImageView imageView;
     
    	public DownloadFilesTask(ImageView imageView){
    		this.imageView=imageView;
    	}
     
    	@Override
    	protected Bitmap doInBackground(String... arg0) {
    		return methodeQuiDownloadEtRetourneUnBitmap(arg0[0]);
    	}
     
    	@Override
    	 protected void onPostExecute(Bitmap bitmap) {
    		imageView.setImageBitmap(bitmap);
         }
    }
    Une telle méthode ne peut pas fonctionner ?
    J'arrive à finir par provoquer une erreur.
    Mais c'est peut être mon getView qui déconne, il redessine toujours 4 fois la vue à la position 0...

    ======================================================
    Edit :
    Soit il manque quelque chose, soit j'ai raté un truc dans mon Adapter, parce chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ViewGroup vg = (ViewGroup) super.getView(position,convertView,parent);
    C'est null la première fois.
    Puisque convertView est null.

    Il faut regarder si convertView est null et si c'est le cas créer un nouveau ViewGroup ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut
    Alors, tout d'abord, merci pour ta réponse.
    J'ai bien créé mes propres classes, l'une héritant de ImageView, et l'autre de SimpleAdapter.

    J'ai d'abord essayé d'utiliser le CustomSimpleAdapter (en remplaçant les images par une autre image de l'application, dans le code du getView). Ca fonctionne.

    J'ai ensuite essayé d'utiliser le CustomImageView, mais l'application plante (même sans aucun modificatione dans setUrl).
    En regardant ça de plus près puis en décomposant, je peux voir que c'est en fait le cast qui crash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ViewGroup vg = (ViewGroup) super.getView(position,convertView,parent);
    ImageView img = (ImageView) vg.findViewById(R.id.itemImagePhoto);
    CustomImageView cust = (CustomImageView) img; // CRASH
     
    /* Un cast directement de la view crash aussi
    CustomImageView cust = (CustomImageView) vg.findViewById(R.id.itemImagePhoto);
    */
    Pourtant, j'ai normalement bien étendu ma classe customImageView (j'ai directement demandé à Eclipse de le faire, à la création de la classe).

    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
    public class CustomImageView extends ImageView
    {
     
    	public CustomImageView(Context context)
    	{
    		super(context);
    	}
     
    	public CustomImageView(Context context, AttributeSet attrs)
    	{
    		super(context, attrs);
    	}
     
    	public CustomImageView(Context context, AttributeSet attrs, int defStyle)
    	{
    		super(context, attrs, defStyle);
    	}
    }
    Je ne vois pas d'où le problème peut venir.
    J'ai vérifié si img (l'ImageView récupérée) était correcte, et il n'y a pas de problème de ce côté puisque je peux bien l'utiliser pour modifier l'image.

    Voilà le logcat, à partir du moment où la ligne est exécutée.

    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
    04-06 10:38:00.629: D/AndroidRuntime(674): Shutting down VM
    04-06 10:38:00.629: W/dalvikvm(674): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
    04-06 10:38:00.676: E/AndroidRuntime(674): Uncaught handler: thread main exiting due to uncaught exception
    04-06 10:38:01.676: E/AndroidRuntime(674): java.lang.ClassCastException: android.widget.ImageView
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at com.appli.extend.CustomSimpleAdapter.getView(CustomSimpleAdapter.java:42)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.AbsListView.obtainView(AbsListView.java:1274)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.ListView.measureHeightOfChildren(ListView.java:1147)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.ListView.onMeasure(ListView.java:1060)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.View.measure(View.java:7964)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.os.Looper.loop(Looper.java:123)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at android.app.ActivityThread.main(ActivityThread.java:4363)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at java.lang.reflect.Method.invokeNative(Native Method)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at java.lang.reflect.Method.invoke(Method.java:521)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    04-06 10:38:01.676: E/AndroidRuntime(674): 	at dalvik.system.NativeStart.main(Native Method)
    04-06 10:38:02.646: I/dalvikvm(674): threadid=7: reacting to signal 3
    04-06 10:38:02.807: I/dalvikvm(674): Wrote stack trace to '/data/anr/traces.txt'

  5. #5
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    T'as un problème de cast de classe à la ligne 42 de CustomSimpleAdapter.java.

    T'as pas du inclure tes.packages.CustomImageView partout.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut
    Oui, c'est bien ce que j'ai dis (problème de cast).

    Je ne pense pas que ça vienne d'un problème de package.
    Le CustomSimpleAdapter et le CustomImageView sont dans le même package.

    Par ailleurs, eclipse ne compilerait pas (erreur affichée) si la classe/le package n'était pas importé aux endroits où la classe est utilisée.

  7. #7
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 299
    Par défaut
    En tout cas chez moi quand dans un fichier de layout je met CustomImageView ça compile bien, mais j'ai une erreur.

    Et c'est en passant par le mode graphique et dans "Custom & Library Views" que j'ai vu que le fichier XML avait besoin du chemin du package.

    Mais ton erreur est peut être différente.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2012, 05h41
  2. insérer une image comme objet ole dans une table
    Par Loutron dans le forum Modélisation
    Réponses: 4
    Dernier message: 29/12/2011, 19h11
  3. Réponses: 5
    Dernier message: 08/11/2010, 20h34
  4. n'affiche pas une image arriere plan definis dans une CSS
    Par mikebranque dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 30/06/2006, 15h54
  5. inserer une image et du texte dans une Jlist
    Par cellestion dans le forum Composants
    Réponses: 4
    Dernier message: 03/03/2006, 23h47

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