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 Java Discussion :

Prendre des Image URL et Afficher en utilisant ListView


Sujet :

Composants graphiques Java

  1. #1
    Membre du Club
    Prendre des Image URL et Afficher en utilisant ListView
    Bonjour,

    Problème: le format de Image URL récupéré est Bitmap ou Drawable,
    Quand ma Listview utilise Listview avec HashMap<String,String>
    HashMap<String,String> qui a bien marché avec R.drawable.bitmappng1
    ListView va afficher: 1 Image et 2 string

    j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HashMap<String,String> map;
    et ArrayList<HashMap<String,String>> listItem = new ArrayList<HashMap<String,String>>();
    si je utilise le bitmap à local dans répétoire drawable: ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.put("img", String.valueOf(R.drawable.bitmappng1));
    - je peur récupérer des images URL mais sur le format: Bitmap ou Drawable.

    Comment on peut chager le format de Bitmat, Drawable à Integer comme (R.drawable.poi2) ???

    J'a déjà essayé avec HashMap<String,Object> map ; mais ne pas marché

    merci à tout !

  2. #2
    Expert éminent
    Bonjour,

    je peur récupérer des images URL mais sur le format: Bitmap ou Drawable.
    Essaye de créer une correspondance entre une chaîne et une bitmap ou drawable via un objet ou tu n'auras qu'a insérer le nom url dans la HashMap et de sauvegarder cet objet dans une Array .

    Lors de l'affichage de la view, récupères la bitmap correspondant au nom .

    Du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Class ImageURL  
    
        String url ;
        Bitmap image;
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre du Club
    Hi

    en fait, je voudrais afficher dans Listview: image + string

    et j'ai déjà utilisé: SimpleAdapter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affichageitem,
                    new String[] {"img", "titre", "description"}, new int[] {R.id.img, R.id.titre, R.id.description});
            
            maListViewPerso.setAdapter(mSchedule);
    Avec afficageitem: fichier xml contient : ImageView et Textview.

    à votre avis.

    dans ce cas: est ce que il faut faire extends de classes:
    - SimpleAdapter
    - ArrayAdapter<T>
    - SimpleCursorAdapter

    et quelle classes est favorable ?

    et quelle method dans nouveau sous-classes

    merci
    -

  4. #4
    Expert éminent
    Personnellement je passerais par une nouvelle class qui hériterait de BaseAdapter.

    un 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
    public class  TonAdapter extends BaseAdapter {
    
            public TonAdapter(Context c ) {
    
            }
    
            public int getCount() {
                return nb_element; // ici la taille de ton tableau
            }
    
            public Object getItem(int position) {
                return null;
            }
    
            public long getItemId(int position) {
                return 0;
            }
    
            // create a new  for each item referenced by the Adapter
            public View getView(int position, View convertView, ViewGroup parent) {
             	// enfin ici tu poura gérer ta vue par ligne en y insérant ton image et le texte en fonction de la position 
    
            }
        }
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre du Club
    Merci votre réponse

    je viens d'essayer avec ArrayAdapter, C'est bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MyCustomAdapter extends ArrayAdapter<String>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public MyCustomAdapter(Context context, int textViewResourceId,String[] objects) {
    			     super(context, textViewResourceId, objects);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public View getView(int position, View convertView, ViewGroup parent)

  6. #6
    Membre à l'essai
    affichage image depuis URL utilisant simpleadapter
    Bonjour,
    est-ce que vous pouvez m'aider svp? avec mon code, quand je fais:
    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
    ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
    
    HashMap<String, String> map;
    
    map = new HashMap<String, String>();
    
    map.put("username",member.getUsername());					map.put("age",String.valueOf(member.getAge()));
    
    URL picture = new URL(member.getUrlPicture(member.getPhoto()).toString());
    Bitmap image= BitmapFactory.decodeStream(picture.openStream());
    map.put("avatar", image);
    
    listItem.add(map); 
    
    final SimpleAdapter mSchedule = new SimpleAdapter (Main.this.getBaseContext(), listItem, R.layout.affichageitem,new String[] {"avatar","username", "age"}, new int[] {R.id.pic,R.id.user,R.id.age});
    listViewMember.setAdapter(mSchedule);
    l'image ne s'affiche pas mais me met en log:
    ... resolveUri failed on bad bitmap uri: android.graphics...... à chaque image

    alors que si je remplace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.put("avatar", image);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.put("avatar", String.value.of(R.drawable.icon));
    bah l'image par défaut d'android peu s'afficher correctement

    je ne vois pas où est le problème.

    est-ce au niveau de URL (au lieu de URI dont je ne sais pas faire la différence);
    est-ce au niveau de mon SimpleAdapter?

    franchement c'est assez urgent, merci!!!

  7. #7
    Expert éminent
    Bonjour,

    C'est quoi la variable "menber" et que te retourne la fonction getPhoto() ?

    Ou stockes tu tes images ?

    Car vu le message d'erreur "android.graphics......" on ne dirait pas un chemin URL .

    Pour la différence entre une URL et URI lien
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  8. #8
    Membre à l'essai
    solution
    j'ai trouvé la solution (enfin) pour ceux qui pourraient être intéréssés:
    d'abord créez cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MyViewBinder implements ViewBinder {
    	@Override
    	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;
    	}
    }
    puis rajouter cette ligne sous le simpleAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mSchedule.setViewBinder(new MyViewBinder());
    changez le type de HashMap en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap<String, Object>();
    puis finalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    URL pictureURL = new URL(member.getUrlPicture(member.getPhoto()).toString());
    Bitmap bitmap = BitmapFactory.decodeStream(pictureURL.openStream());
    map.put("littleAvatar",bitmap);
    Ce lien m'a bcp aidé!

    http://www.anddev.org/listview_simpl...g_-t11817.html

  9. #9
    Membre à l'essai

    Merci Feanorin, la clé a été d'utiliser ViewBender

  10. #10
    Membre du Club
    Tu peur utiliser ce code
    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
     @Override
    		 public View getView(int position, View convertView, ViewGroup parent) {
    			  // TODO Auto-generated method stub
    			  //return super.getView(position, convertView, parent);		 
    			  View row = convertView;		 
    			  if(row==null){
    				   LayoutInflater inflater=getLayoutInflater();
    				   row=inflater.inflate(R.layout.affichageitem, parent, false);
    			  }
    		 
    			  TextView tvTitre=(TextView)row.findViewById(R.id.titre);
    			  tvTitre.setText(titre[position]);
    			  
    			  TextView tvDescription=(TextView)row.findViewById(R.id.description);
    			  tvDescription.setText(des[position]);
    		  
    			  ImageView imIcon=(ImageView)row.findViewById(R.id.img);			 
    			  imIcon.setImageBitmap(listItem.get(position));
    		  
    			  return row;
    		 }
    	}
    et crer affichageitem.xml avec les noms equivalent

  11. #11
    Membre du Club
    Citation Envoyé par latitude_android Voir le message
    j'ai trouvé la solution (enfin) pour ceux qui pourraient être intéréssés:
    d'abord créez cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MyViewBinder implements ViewBinder {
    	@Override
    	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;
    	}
    }
    puis rajouter cette ligne sous le simpleAdapter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mSchedule.setViewBinder(new MyViewBinder());
    changez le type de HashMap en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap<String, Object>();
    puis finalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    URL pictureURL = new URL(member.getUrlPicture(member.getPhoto()).toString());
    Bitmap bitmap = BitmapFactory.decodeStream(pictureURL.openStream());
    map.put("littleAvatar",bitmap);
    Ce lien m'a bcp aidé!

    http://www.anddev.org/listview_simpl...g_-t11817.html
    Salut

    S'il vous plaît, c'est quoi le variable membre ?

    Merci

  12. #12
    Membre du Club
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    C'est quoi la variable "menber" et que te retourne la fonction getPhoto() ?

    Ou stockes tu tes images ?

    Car vu le message d'erreur "android.graphics......" on ne dirait pas un chemin URL .

    Pour la différence entre une URL et URI lien
    slt ,

    je développe une listview avec des images parser en json php

    mais les images apparu en des tailles différents
    j'ai deja inserer l'image de listview.

    Restaurant.java

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    package com.pxr.tutorial.json;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.ListActivity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;
    import android.widget.AdapterView.OnItemClickListener;
    
    import com.pxr.tutorial.xmltest.R;
    
    public class Restaurant extends ListActivity {
    	String urlresto= "http://www.monresto.net/partenaires/restaurant/";
    	int width = 100;
    	int height = 200;
    	
        //TextView tv;
    	 @Override
        public void onCreate(Bundle savedInstanceState) {
        	
        	super.onCreate(savedInstanceState);;
            setContentView(R.layout.listplaceholder);
            Button button = new Button(this);
    		Bundle bundle = getIntent().getExtras();
    		if (bundle != null) {
    			button.setText("Item name = " + bundle.getString("id")
    					+ " --- Go Back ");
    		} else {
    			button.setText("Go Back");
    		}
            
            
            ArrayList<HashMap<String, Object>> mylist = new ArrayList<HashMap<String, Object>>();
          
            
            JSONObject json = JSONfunctions.getJSONfromURL("http://monresto.net/android/marsa.php?id_cp="+ bundle.getString("id"));
                    
            try{
            	
            	JSONArray  monrestodb1 = json.getJSONArray("monrestodb1");
            	
    	        for(int i=0;i<monrestodb1.length();i++){						
    				HashMap<String, Object> map = new HashMap<String, Object>();	
    				JSONObject e = monrestodb1.getJSONObject(i);
    				
    				map.put("name",  String.valueOf(i));
    	        	map.put("name", "" + e.getString("nom"));
    	        	map.put("id", "" + e.getString("id"));
    	        	
    	        	//map.put("photo",bitmap);
    	        	map.put("photo", "" + e.getString("photo"));
    	        	URL aURL = new URL("http://monresto.net/partenaires/restaurant/"+ e.getString("photo")); 
    	        	
    	        	Bitmap bitmap = BitmapFactory.decodeStream(aURL.openStream());
    	        	
    	        	//bitmap.getScaledHeight(200);
    	        	//bitmap.getScaledWidth(100);
    	        	map.put("photo",bitmap);
    	        		        	
    	        	//map.put("magnitude", "Magnitude: " +  e.getString("magnitude"));
    	        	mylist.add(map);			
    			}		
            }catch(JSONException e)        {
            	 Log.e("log_tag", "Error parsing data "+e.toString());
            } catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            
            SimpleAdapter adapter = new SimpleAdapter(this, mylist , R.layout.listmontplaisir, 
                            new String[] { "name", "photo" }, 
                            new int[] { R.id.montplaisirtext , R.id.image });
            adapter.setViewBinder(new MyViewBinder());
            setListAdapter(adapter);
            
            final ListView lv = getListView();
            lv.setTextFilterEnabled(true);	
            lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        		
            		@SuppressWarnings("unchecked")
    				HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);	        		
            		Toast.makeText(Restaurant.this, "NAME '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); 
            	
            	Intent intent = new Intent(Restaurant.this, Famille_plat.class);
            		//intent.putExtra("url", "http://monresto.net/android/marsa.php");
            	String txt = o.get("id");
        		intent.putExtra("id", txt);
        		 
        		startActivity(intent);
    			}
    
    			
    			});
    		
            }
           
        }
    MyViewBinder.java

    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
    package com.pxr.tutorial.json;
    
    import android.graphics.Bitmap;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.SimpleAdapter.ViewBinder;
    
    public class MyViewBinder implements ViewBinder {
    	@Override
    	public boolean setViewValue(View view, Object mylist,String textRepresentation) {
    		if( (view instanceof ImageView) & (mylist instanceof Bitmap) ) {
    			ImageView iv = (ImageView) view;
    			Bitmap bm = (Bitmap) mylist;	
    			iv.setImageBitmap(bm);	
    			return true;
    		}
     
    		return false;
    	}
    }

  13. #13
    Expert éminent
    Bonjour,

    Juste pour clarifier , en fait tu aimerais avoir une même taille pour tes images , c'est ça ?


    Si c'est le cas il faut plus que tu te penches du côté de ton layout.
    essaye de définit un espace fixe dans ce layout pour ton image , tu peux voir avec les propriété layout_weight je pense.

    Après utilise juste la propriété AdjustViewBounds je crois qu'elle s’appelle comme cela pour ton imageView est met là à true .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  14. #14
    Membre du Club
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    Juste pour clarifier , en fait tu aimerais avoir une même taille pour tes images , c'est ça ?


    Si c'est le cas il faut plus que tu te penches du côté de ton layout.
    essaye de définit un espace fixe dans ce layout pour ton image , tu peux voir avec les propriété layout_weight je pense.

    Après utilise juste la propriété AdjustViewBounds je crois qu'elle s’appelle comme cela pour ton imageView est met là à true .
    aaahhhhhhhhhhh oui c vrai
    j'ai la resolu merci

  15. #15
    Membre du Club
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    Juste pour clarifier , en fait tu aimerais avoir une même taille pour tes images , c'est ça ?


    Si c'est le cas il faut plus que tu te penches du côté de ton layout.
    essaye de définit un espace fixe dans ce layout pour ton image , tu peux voir avec les propriété layout_weight je pense.

    Après utilise juste la propriété AdjustViewBounds je crois qu'elle s’appelle comme cela pour ton imageView est met là à true .
    slt ,

    dans ma classe restaurant.java au dessus lorsque je clique sur une item pour me prendre a l'autre activity ne fonctionne pas
    j'ai sais pas pourquoi; svp aider moi pour resoudre cet probléme.

  16. #16
    Expert éminent
    Bonjour,
    dans ma classe restaurant.java au dessus lorsque je clique sur une item pour me prendre a l'autre activity ne fonctionne pas
    j'ai sais pas pourquoi; svp aider moi pour resoudre cet probléme.
    As tu une erreur ? As tu essayé de débogguer ton application pour savoir si tu intercepter l'évènement ? ...

    Merci .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  17. #17
    Membre du Club
    Citation Envoyé par Feanorin Voir le message
    Bonjour,


    As tu une erreur ? As tu essayé de débogguer ton application pour savoir si tu intercepter l'évènement ? ...

    Merci .
    salut ,

    oui j'ai débogguer l'application et j'ai eu le log cat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    06-09 07:53:50.774: WARN/KeyCharacterMap(1016): No keyboard for id 0
    06-09 07:53:50.774: WARN/KeyCharacterMap(1016): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

  18. #18
    Expert éminent
    Bonjour,

    Ton log ne m'aide pas beaucoup .

    Essaye de regarder si tu rentres bien dans la procédure de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    As tu le toast qui s'affiche au fait ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  19. #19
    Membre du Club
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    Ton log ne m'aide pas beaucoup .

    Essaye de regarder si tu rentres bien dans la procédure de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    As tu le toast qui s'affiche au fait ?
    tt ca existe dans mon code

    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
    lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        		
            		@SuppressWarnings("unchecked")
    				HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);	        		
            		Toast.makeText(Restaurant.this, "NAME '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); 
            	
            	Intent intent = new Intent(Restaurant.this, Famille_plat.class);
            		//intent.putExtra("url", "http://monresto.net/android/marsa.php");
            	String txt = o.get("id");
        		intent.putExtra("id", txt);
        		 
        		startActivity(intent);
        		
        		
    			}

  20. #20
    Expert éminent
    Arg , je ne me suis pas fait comprendre .

    tout ca existe dans mon code
    Je voulais juste savoir si tu y rentrais dans ce code ! t si le toast que tu as codé s'afficher.

    Essaye de regarder si tu rentres bien dans la procédure de ton code
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

###raw>template_hook.ano_emploi###