Partage
  • Partager sur Facebook
  • Partager sur Twitter

CustomAdapter

    6 août 2015 à 18:14:53

    salut a tous,

    Mon probleme est le suivant:

    J'ai une listview dans lequel je voudrais affiché du texte et des images telecharger depuis un flux rss.

    Le probleme est que je ne comprend pas vraiment la maniere dont je doit procéder .

    D'apres ce que j'ai compris il est préférable de faire un adapter personnalisé pour plus de magnabilité au moment de l'affichage via la listview.

    Ce que j'ai fait ,mais je me suis un peut perdu et je ne sais plus quoi faire.

    J'ai recherche different exemple sur internet, j'en trouve tous aussi diffente que les autres avec tres peut (toute les images sont deja en memoire ) ou voir aucun similitude(ils n'heritent pas de BaseAdapter mais de arrayAdapter ce qui implique un peut plus de dificulté vue la genéricité).

    voici mon code ci-dessous pouvez vous me dire ou sa ne vas pas :

    class charg

    public class NoeudItems {
    
        String titre;
        String description;
        String strbitmap;
        Bitmap bitmap;
    
         NoeudItems(){
    
        }
       public void Items(String title,String descrip,String strbtmp){
    
           title=titre;
           descrip=description;
           strbtmp=strbitmap;
    
           try {
               bitmap= BitmapFactory.decodeStream(new URL(strbtmp).openStream());
           } catch (IOException e) {
               bitmap=null;
               e.printStackTrace();
           }
       }
    }
    

    class de mon adapter

    public class CustomAdapter extends ArrayAdapter<NoeudItems> {
    
        NoeudItems noeudItems;
        Context context;
    
    
        @Override
        public int getCount() {
            return 0;
        }
    
        @Override
        public Object getItem(int i) {
            return null;
        }
    
        @Override
        public long getItemId(int i) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            LayoutInflater inflater=(LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.listviewlayout,parent,false);
    
            ImageView imageArticle=(ImageView)convertView.findViewById(R.id.ImageArticle);
            TextView textTitre=(TextView)convertView.findViewById(R.id.texttitre);
            TextView textDescription=(TextView)convertView.findViewById(R.id.textviewdescription);
    
            textTitre.setText(noeudItems.titre);
            textDescription.setText(noeudItems.description);
            imageArticle.setImageBitmap(noeudItems.bitmap);
    
            return convertView;
        }
    }
    
    

    classe principal avec le thread pour recupérer les infos:

    public class MainActivity extends ActionBarActivity {
    
    
        ListView listView;
    
        DocumentBuilder documentBuilder;
        DocumentBuilderFactory documentBuilderFactory;
        Document document;
        Element element;
        NodeList listdenoeud;
        HttpURLConnection httpURLConnection;
        private URL url;
        private URL urlbitmap;
    
        //string recup d'info html
        private int nbrArticle;
        private String strurl;
        private String titre="";
        private String description="";
        private String date="";
        private String liens="";
        private String urlimage="";
    
        ArrayList<NoeudItems> menu;
        CustomAdapter customAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            strurl="http://www.MachinTruc.xml";
            listView=(ListView)findViewById(R.id.mylistview);
            new BackgroundTask().execute();
    
    
            customAdapter=new CustomAdapter(this,R.layout.listviewlayout);
    
            listView.setAdapter(customAdapter);
    
        }
    
      class BackgroundTask extends AsyncTask<Void,String,Void>{
    
          @Override
          protected Void doInBackground(Void... voids) {
              try{
                  url = new URL(strurl);
                  httpURLConnection=(HttpURLConnection) url.openConnection();
                  if ( httpURLConnection.getResponseCode()==HTTP_CREATED){
                      documentBuilderFactory = DocumentBuilderFactory.newInstance();
                      documentBuilder=documentBuilderFactory.newDocumentBuilder();
                      document=documentBuilder.parse(new InputSource(url.openStream()));
                      listdenoeud=document.getElementsByTagName("item");
                      nbrArticle=listdenoeud.getLength();
                      HashMap<String,String> hashMap = new HashMap<>();
                      if (nbrArticle>0 || !(listdenoeud==null)){
                          for (int i =0;i<listdenoeud.getLength();i++){
    
                              Node node =listdenoeud.item(i);
                              if (node.getNodeType() ==Node.ELEMENT_NODE){
    
                                  element=(Element) node;
                                  //titre
                                  NodeList subitem=element.getElementsByTagName("title");
                                  hashMap.put(titre,subitem.item(0).getChildNodes().item(0).getNodeValue());
                                  //description
                                  subitem=element.getElementsByTagName("description");
                                  hashMap.put(description,subitem.item(0).getChildNodes().item(0).getNodeValue());
                                 
                                  //url pour le webview
                                  subitem=element.getElementsByTagName("link");
                                  hashMap.put(liens,subitem.item(0).getChildNodes().item(0).getNodeValue())
     //url images //subitem=element.getAttributes().getNamedItem("url"); hashMap.put(urlimage, subitem.item(0).getChildNodes().item(0).getNodeValue()); menu.add(hashMap); } } } } } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } return null; } } }

    il y a aussi un soucis de généricité avec ma arraylist mais je suis en train de revoir le cours pour mieux comprendre mon erreur.

    -
    Edité par litv 6 août 2015 à 18:43:33

    • Partager sur Facebook
    • Partager sur Twitter

    On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

      10 août 2015 à 0:32:32

      j'ai resolu un floppé d'erreur qui se sont glissés au moment ou je codais mon programme .

      Maintenant j'arrive enfin  lancé mon application sans qu'il plante mais mon listview ne s'affiche pas.

      -
      Edité par litv 10 août 2015 à 0:33:06

      • Partager sur Facebook
      • Partager sur Twitter

      On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

        10 août 2015 à 9:12:16

        litv971 a écrit:

        Maintenant j'arrive enfin  lancé mon application sans qu'il plante mais mon listview ne s'affiche pas.

        Vu ton code c'est normal. :)

        Tu ne donnes jamais ta liste d'objets à afficher à ton adaptateur et même si tu lui passais la liste d'objet, tu lui dis de ne rien afficher via la méthode

        @Override
        public int getCount() {
          return 0;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          11 août 2015 à 20:45:12

          D'accord, je crois avoir compris mon erreur.

          quand tu parle de passer ma liste d'objet à l'adapter je suppose que tu parle de ceci

          customAdapter=new CustomAdapter(this,R.layout.listviewlayout,LaListeAPasser);
          listView.setAdapter(customAdapter);

          et pour la méthode getCount ,  tu fait allusion à ca?

          @Override
          public int getCount() {
            return list.size;
          }




          • Partager sur Facebook
          • Partager sur Twitter

          On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

            11 août 2015 à 23:48:30

            c'est bizard car quand je retourne la taille de la liste  j'obtient une erreur disant :
              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference

             j'ai remarqué que le probleme apparait au moment où je remplis ma liste avec la boucle. d'ou le fait que la methode revienne null/0 .

            -
            Edité par litv 12 août 2015 à 1:23:20

            • Partager sur Facebook
            • Partager sur Twitter

            On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

              12 août 2015 à 22:36:57

              ahh ok hmmm avant d'avoir factorisé mon code j'obtenais quelque chose comme ceci:
                  Process: com.example.litv.textflux, PID: 5600
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.litv.textflux/com.example.litv.textflux.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418)
                          at android.app.ActivityThread.access$900(ActivityThread.java:154)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:135)
                          at android.app.ActivityThread.main(ActivityThread.java:5289)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:372)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
                   Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                          at com.example.litv.textflux.CustomAdapter.getCount(CustomAdapter.java:30)
                          at android.widget.ListView.setAdapter(ListView.java:487)
                          at com.example.litv.textflux.MainActivity.onCreate(MainActivity.java:62)
                          at android.app.Activity.performCreate(Activity.java:5990)
                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418)
                          at android.app.ActivityThread.access$900(ActivityThread.java:154)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:135)
                          at android.app.ActivityThread.main(ActivityThread.java:5289)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:372)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

               et maintenant apres l'avoir alléger  :

               Process: com.example.litv.textflux, PID: 7191
                  java.lang.RuntimeException: An error occured while executing doInBackground()
                          at android.os.AsyncTask$3.done(AsyncTask.java:304)
                          at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                          at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                          at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                          at java.lang.Thread.run(Thread.java:818)
                   Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void java.util.List.add(int, java.lang.Object)' on a null object reference
                          at com.example.litv.textflux.MainActivity$BackgroundTask.doInBackground(MainActivity.java:97)
                          at com.example.litv.textflux.MainActivity$BackgroundTask.doInBackground(MainActivity.java:74)
                          at android.os.AsyncTask$2.call(AsyncTask.java:292)
                          at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                          at java.lang.Thread.run(Thread.java:818)

              c'est deja un peu plus precis avec sa (du moins je trouve).

              • Partager sur Facebook
              • Partager sur Twitter

              On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

                13 août 2015 à 7:53:35

                Peux-tu poster la dernière version de ton adapter ?

                • Partager sur Facebook
                • Partager sur Twitter
                  13 août 2015 à 20:46:07

                  la derniere version de mon adapter est celle-ci :
                  public class CustomAdapter extends ArrayAdapter<NoeudItems> {
                  
                      Bitmap bitmap;
                      LayoutInflater inflater;
                      Context cContext;
                       ArrayList<NoeudItems> list=null;
                  
                      public CustomAdapter(Context context,ArrayList<NoeudItems> e){
                          super(context,R.layout.listviewlayout,e);
                          this.list=e;
                          this.cContext=context;
                          this.inflater=inflater.from(context);
                      }
                      @Override
                      public int getCount() {
                          return  list.size();
                      }
                  
                      @Override
                      public  NoeudItems getItem(int i) {
                          return list.get(i);
                      }
                  
                      @Override
                      public long getItemId(int i) {
                          return 0;
                      }
                  
                  	@Override
                  	public View getView(int i, View convertView, ViewGroup parent) {
                  
                  		View view = inflater.inflate(R.layout.listviewlayout,parent,false);
                  		HolderView holderView = null;
                  		holderView.imageArticle=(ImageView)convertView.findViewById(R.id.ImageArticle);
                  		holderView.textTitre=(TextView)convertView.findViewById(R.id.texttitre);
                  		holderView.textDescription=(TextView)convertView.findViewById(R.id.textviewdescription);
                  
                  		holderView.textTitre.setText(list.get(i).titre);
                  		holderView.textDescription.setText(list.get(i).description);
                  		try {
                  			bitmap= BitmapFactory.decodeStream(new URL(list.get(i).strbitmap).openStream());
                  		} catch (IOException e) {
                  			bitmap=null;
                  			e.printStackTrace();
                  		}
                  		holderView.imageArticle.setImageBitmap(bitmap);
                  
                  		return view;
                  	}
                  
                  	class HolderView{
                  		ImageView imageArticle;
                  		TextView textTitre;
                  		TextView textDescription;
                  	}
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter

                  On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

                    14 août 2015 à 8:45:19

                    Autant pour moi, j'avais lu la stacktrace trop rapidement...

                    C'est une AsyncTask qui pète et non ton adaptateur. Du coup c'est possible d'avoir le code ta MainActivity ainsi que de l' AsyncTask qui est déclarée en inner ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 août 2015 à 7:52:39

                      voici le code entié de ma MainActivity :
                      public class MainActivity extends ListActivity {
                      
                          ListView listView;
                      
                          DocumentBuilder documentBuilder;
                          DocumentBuilderFactory documentBuilderFactory;
                          Document document;
                          Element element;
                          NodeList listdenoeud;
                      
                      
                          //string recup d'info html
                          private int nbrArticle;
                          private String strurl;
                          public String titre="";
                          public String description="";
                          public String liens="";
                          public String urlimage="";
                          ArrayList<NoeudItems> listTitre;
                      
                      
                          @Override
                          protected void onCreate(Bundle savedInstanceState) {
                              super.onCreate(savedInstanceState);
                              setContentView(R.layout.activity_main);
                              strurl="http://www.lemonde.fr/m-actu/rss_full.xml";
                              listView=(ListView)findViewById(android.R.id.list);
                              new BackgroundTask().execute();
                              CustomAdapter adapter=new CustomAdapter(getApplicationContext(),listTitre);
                              listView.setAdapter(adapter);
                              
                          }
                      
                        class BackgroundTask extends AsyncTask<Void,String,Void>{
                      
                            @Override
                            protected Void doInBackground(Void... voids) {
                      
                                    try {
                                        //lecture du fichier xml et ajout dans la bdd
                                        documentBuilderFactory =DocumentBuilderFactory.newInstance();
                                        documentBuilder=documentBuilderFactory.newDocumentBuilder();
                                        document=documentBuilder.parse(new InputSource(strurl));
                                        document.getDocumentElement().normalize();
                                        listdenoeud=document.getElementsByTagName("item");
                      
                                        //boucle de recuperation des attribues des noeuds situer dans le xml
                                        for (int i = 0; i <listdenoeud.getLength() ; i++) {
                                            Node noeud=listdenoeud.item(i);
                                            if(noeud.getNodeType()==Node.ELEMENT_NODE) {
                                                element = (Element) noeud;
                                                listTitre = new ArrayList<NoeudItems>();
                                                liens = element.getElementsByTagName("link").item(0).getTextContent();
                                                titre = element.getElementsByTagName("title").item(0).getTextContent();
                                                urlimage = element.getElementsByTagName("enclosure").item(0).getAttributes().item(2).getTextContent();
                                                description = element.getElementsByTagName("description").item(0).getTextContent();
                                                //foutu bug de la methode si-dessous
                                                listTitre.add(i, new NoeudItems(titre, description, urlimage, liens));
                                            }
                                        }
                      
                                    } catch (ParserConfigurationException e) {
                                        e.printStackTrace();
                                    } catch (SAXException e) {
                                        e.printStackTrace();
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                return null;
                            }
                      
                        }
                      
                      }
                      J'ai effectué plusieurs test avec des Toast et autres conditions pour connaitre la taille de la arraylist qui etait retourné par fonction getCount de mon adapter mais elle etait egal a 1 ou 0 ;

                      -
                      Edité par litv 15 août 2015 à 7:53:40

                      • Partager sur Facebook
                      • Partager sur Twitter

                      On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

                        24 août 2015 à 5:17:01

                        Il y a quelques jour, j'ai pu comprendre d'où venais le probleme dans mon code :

                        je recupere les noeuds XML dans un thread asynchrone alors que dans mon thread principal je passe directement à la  fonction suivante alors que mon asyncTask n'avais pas encore les informations à affiché dans la listview.

                        Du coup pour cela j'ai fait ceci:

                         AsyncTask.Status status =backgroundTask.doInBackground();
                                if (status != AsyncTask.Status.RUNNING){
                                        listView.setAdapter(new CustomAdapter(getApplicationContext(),listTitre));
                                    }
                        le probleme est que mon objet status ne recupere pas l'etat de mon asynctask "BackgroundTask" ce qui me genere une erreur . Pour m'assurer que status recupere bien l'etat de celui-ci ,la fonction doInBackground de l'asynctask  return un status.

                        Mais rien n'a faire j'ai toujours une erreur dans mon logcat:

                             Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.AsyncTask$Status com.example.litv.textflux.MainActivity$BackgroundTask.doInBackground(java.lang.String[])' on a null object reference
                        


                        quelqu'un pourrais m' aiguiller?

                        • Partager sur Facebook
                        • Partager sur Twitter

                        On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?

                        CustomAdapter

                        × 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