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 :
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
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).
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
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 ?
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
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
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?
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.
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
Mon site - Mon livre sur le XML - Mon blog
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
Mon site - Mon livre sur le XML - Mon blog
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
Mon site - Mon livre sur le XML - Mon blog
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
Mon site - Mon livre sur le XML - Mon blog
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
Mon site - Mon livre sur le XML - Mon blog
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 ;
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?
On m'a dit qu'un bon programmeur est fainéant ,est-ce vrai?