Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] ListView avec image téléchargée + XML + AsyncTask

Impossible d’implémenter le téléchargement de l'image

    15 août 2011 à 21:02:03

    Bonsoir tout le monde,

    La partie de mon application que je suis en train d'essayer de développer consiste à afficher une ListView (c'est une ListActivity), cette ListView est crée grâce à un XML que je télécharge (puis interprète).

    Le XML contient, pour chaque item (news) les nœuds:
    • id
    • titre
    • pubDate (date de publication)
    • img (URL de la vignette)


    Je fais appel à vous car il m'est impossible d’implémenter un code permettant de placer les vignettes téléchargées sur Internet (à partir de son URL correspondante).
    Sachant qu'il faut faire cela de préférence après avoir placé les textes, de manière à ne pas freezer l'application...

    J'utilise aussi Async, ce que rend la tâche plus complexe, étant donné que je suis encore débutant dans le domaine Java...

    Passons au code:

    Mon fichier Actualites.java:
    package ............;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    
    import android.app.ListActivity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;
    
    
    public class Actualites extends ListActivity {
    		
        public ArrayList<HashMap<String, String>> mylist;
        public ListAdapter adapter;
        public ProgressDialog progressDialog; 
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listplaceholder);
            
            
            mylist = new ArrayList<HashMap<String, String>>();
           
            adapter = new SimpleAdapter(this, mylist , R.layout.actualites, 
                            new String[] { "img", "title", "pubDate" }, 
                            new int[] { R.id.img, R.id.item_title, R.id.item_subtitle });
                    
            
            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(Actualites.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_LONG).show();
    		}
    	});
            
            progressDialog = ProgressDialog.show(Actualites.this, "Chargement...", "Téléchargement en cours des dernières actualités");
            new GetDataTask().execute();        
            
        }
        
        private Boolean isOnline()	{
        	ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        	NetworkInfo ni = cm.getActiveNetworkInfo();
        	if(ni != null && ni.isConnected())
        		return true;
    
        	return false;
        }
    
        
        private class GetDataTask extends AsyncTask<Void, Void, Integer> {
        	
            @Override
            protected Integer doInBackground(Void... params) {
            	       	        	
    		if(isOnline()){
    	            mylist.clear();   
    	        	
    	            String xmlURL = "http://exemple.com/mon_fichier_xml.xml";
    	            String xml = XMLfunctions.getXML(xmlURL);
    	            
    	            Document doc = XMLfunctions.XMLfromString(xml);
    	                    
    	            int numResults = XMLfunctions.numResults(doc);
    	            
    	            if((numResults <= 0)){
    	            	Toast.makeText(Actualites.this, "Aucun résultat trouvé", Toast.LENGTH_LONG).show();  
    	            	finish();
    	            }
    	                    
    	    		NodeList nodes = doc.getElementsByTagName("item");
    	    					
    	    		for (int i = 0; i < nodes.getLength(); i++) {							
    	    			HashMap<String, String> map = new HashMap<String, String>();	
    	    			
    	    			Element e = (Element)nodes.item(i);
    	    			map.put("id", XMLfunctions.getValue(e, "id"));
    	            		map.put("title", XMLfunctions.getValue(e, "title"));
    	            		map.put("pubDate", XMLfunctions.getValue(e, "pubDate"));
    
    	            		// On récupère l'url de l'image avec
    	            		// XMLfunctions.getValue(e, "img")
    
    	            		mylist.add(map);			
    	    		}
    		} else {
    			Toast.makeText(Actualites.this, "Pas de connexion...", Toast.LENGTH_LONG).show();			
    		}
        		
                return 1;
            }
    
            @Override
            protected void onPostExecute(Integer result) {
            	setListAdapter(adapter);
            	progressDialog.dismiss();
            	super.onPostExecute(result);
            }
        }
        
        
    }
    

    NB: XMLfunctions est une class Java permettant de manipuler plus facilement les fichiers XML.


    Mon fichier listplaceholder.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">	
    
        <ListView
            android:id="@+id/android:list"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"
            />
    
        <TextView
            android:id="@id/android:empty"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="No data"/>
    
    </LinearLayout>
    


    Mon fichier actualites.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="3dp"
        >
    
    <!-- Le fameux emplacement pour la vignette -->
        <ImageView
    		android:id="@+id/img"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    	   	android:layout_gravity="center_vertical"
    	   	android:padding="10px"
    		/>
     
    	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	    android:orientation="vertical"
    	    android:layout_width="fill_parent"
    	    android:layout_height="wrap_content"
    	   	android:layout_gravity="center_vertical"
    	   	android:paddingLeft="10px"
    	    android:layout_weight="1"
    	    >
     
    	    <TextView android:id="@+id/item_title"
    	         android:layout_height="fill_parent"
    	         android:textSize="20dp"
    	         android:textStyle="bold" android:layout_width="match_parent"/>
     
    	    <TextView android:id="@+id/item_subtitle"
    	         android:layout_width="fill_parent"
    	         android:layout_height="fill_parent"
    	         android:textSize="13dp"
    	         />
     
        </LinearLayout>
    
    </LinearLayout>
    


    En état, le code ci-dessus fonctionne parfaitement, c'est pour les images où ça ne va pas.

    En vous remerciant par avance de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2012 à 23:17:39

      Bonjour,

      Pour télécharger ton image, voici comment procéder :

      final Bitmap img = BitmapFactory.decodeStream(new URL("lien").openStream());
      


      Ensuite, pour afficher ton image à l'écran, voici comment procéder :

      final ImageView imgView = (ImageView)findViewById(R.id.img);
      imgView.setImageBitmap(bmp);
      
      • Partager sur Facebook
      • Partager sur Twitter

      [Android] ListView avec image téléchargée + XML + AsyncTask

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown