【问题标题】:Using Jsoup to populate a ListView使用 Jsoup 填充 ListView
【发布时间】:2013-04-23 19:45:39
【问题描述】:

我正在尝试使用 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 中,我需要从 a 标记中获取 href,以及 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。我曾尝试重新安排等,但仍然没有运气。如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: java android screen-scraping jsoup


    【解决方案1】:

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

    您可以在进程完成时调用 _adapter.notifyDataSetChanged()

    更新

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

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

    【讨论】:

    • 感谢@tjPark 的回复。我的代码中没有 getView() 。也许这是问题的一部分?你有我如何实现这个的例子吗?
    • @Shan 我的回复可能是错误的,现在我看到你的构造函数有点不同.. 但是,本教程非常适合 listview:http://www.vogella.com/articles/AndroidListView/article.html
    • 我从 List 更改为 Map,它现在填充 ListView,但它只是一遍又一遍地添加最后一组 col_1、col_2。
    • 谢谢@tjPark!现在就试试这个。
    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多