0

我正在尝试使用 Jsoup 解析网站,获取我获得的信息并填充ListView. HTML 如下所示:

<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>

所以,从这个 HTML 中,我需要href从 a 标签和 span.user_name 文本中获取。我需要获取这两个元素并将它们存储在一个HashMap(我认为??)现在,我有一个AsyncTask这样的(但我不认为我这样做是正确的):

    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);
    }
}

这成功打印出我想要的信息,但它没有填充ListView. 我曾尝试重新安排等,但仍然没有运气。如果有任何帮助,我将不胜感激。

4

1 回答 1

0

检查您的 SimpleAdapter 类中的 getView()。getView() 返回的视图应正确显示每个项目。

进程完成后,您可以调用 _adapter.notifyDataSetChanged()

更新

好的,我想我找到了您可能引用的示例。问题是,您一次又一次地使用相同的 HashMap。如果您一次又一次地将任何字符串放在任何键(“col_1”或“col_2”)上,它只会保存最后一个。因此,当您在屏幕上显示它时(在 onPostExecute 之后),所有视图将显示最后一个正式名称和用户名,因为添加到列表中的所有 HashMap 都只保存相同的最后一个(它们实际上是同一个 HashMap)。

我建议您每次在 fillMaps 上添加新的 HashMap。

于 2013-04-23T20:31:36.190 回答