2013-04-23 2 views
0

J'essaye d'analyser un site Web en utilisant Jsoup, prenez l'information que je reçois et remplissez un ListView. Le code HTML ressemble à ceci:Utilisation de Jsoup pour remplir un ListView

<ul class="list_view"> 
    <li> 
    <a href="/username/" > 
     <table class="pinner"> 
     <tbody> 
      <tr> 
      <td class="first_td"> 
       <img src="http://myimgurl.com/img.jpg">           
      </td> 
      <td> 
       <span class="user_name">User Name</span> 
      </td> 
      </tr> 
     </tbody> 
     </table> 
    </a> 
    </li> 
</ul> 

Ainsi, à partir de ce HTML, je dois obtenir le href de la balise, ainsi que le texte span.user_name. Je dois prendre ces deux éléments et les stocker dans un HashMap (je pense ??) En ce moment, je l'ai dans un AsyncTask comme ça (mais je ne pense pas que je le fais de la bonne façon):

private class MyTask extends AsyncTask<Void, Void, List<HashMap<String, String>>> { 

    @Override 
    protected List<HashMap<String, String>> doInBackground(Void... params) { 

     List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); 
     HashMap<String, String> map = new HashMap<String, String>(); 
     try { 
      Document doc = Jsoup.connect("http://myurl.com").get(); 
      Elements formalNames = doc.select("li a table tbody tr td span.user_name"); 
      Elements userNames = doc.select("li a"); 

      for (Element formalName : formalNames) { 
       map.put("col_1", formalName.text()); 
       fillMaps.add(map); 

       System.out.println(formalName.text()); 

      } 
      for (Element userName : userNames) { 
       map.put("col_2", userName.attr("href").toString()); 
       fillMaps.add(map); 

       System.out.println(userName.attr("href").toString()); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return fillMaps; 

    } 

    @Override 
    protected void onPostExecute(List<HashMap<String, String>> result) { 

     String[] from = new String[] {"col_1", "col_2"}; 
     int[] to = new int[] { R.id.text1, R.id.text2 }; 
     ListView _listview = (ListView)findViewById(R.id.listView1); 

     SimpleAdapter _adapter = new SimpleAdapter(FriendsActivity.this, fillMaps, R.layout.friends, from, to); 
     _listview.setAdapter(_adapter); 
    } 
} 

Cela imprime avec succès l'information que je veux, mais il ne remplit pas le ListView. J'ai essayé de réarranger, etc. mais toujours pas de chance. Je serais très reconnaissant pour toute aide.

Répondre

0

Vérifiez getView() dans votre classe SimpleAdapter. la vue retournée par getView() devrait montrer un chaque article correctement.

Vous pouvez appeler _adapter.notifyDataSetChanged() lorsque le processus terminé

mis à jour

ok je suppose que je l'ai trouvé l'exemple u pourrait référencé. Le problème est que vous utilisez le même HashMap encore et encore. Si vous placez une chaîne sur n'importe quelle touche ("col_1" ou "col_2") encore et encore, elle n'enregistre que la dernière. Ainsi, lorsque vous l'affichez à l'écran (après onPostExecute), toutes les vues affichent le dernier nom formel et le nomUtilisateur, car toutes les HashMap ajoutées à votre liste n'enregistrent que la dernière (elles sont en fait la même HashMap) .

Je vous suggère de créer un nouveau HashMap chaque fois que vous l'ajoutez dans les fillMaps.

+0

Merci pour la réponse @tjPark. Je n'ai pas getView() dans mon code. Peut-être que cela fait partie du problème? Avez-vous un exemple de comment je peux mettre en œuvre cela? – Shan

+0

@Shan ma réponse pourrait être fausse, maintenant je vois votre constructeur est un peu différent .. cependant, ce tutoriel est idéal pour listview: [http://www.vogella.com/articles/AndroidListView/article.html](http : //www.vogella.com/articles/AndroidListView/article.html) – tjPark

+0

J'ai changé de List en Map et il remplit le ListView maintenant, mais il ajoute seulement le dernier ensemble de col_1, col_2 encore et encore. – Shan

Questions connexes