Android - 使用AsycTaskLoader填充列表& MySQL的

时间:2012-09-19 11:15:16

标签: android mysql android-listview android-asynctask android-loadermanager

我想用从MySql数据库加载的某些对象填充ListFragment。

它必须从我的ResultSet加载前10个'对象'。 我想为此使用AsyncTaskLoader,并在每次从数据库中检索它时将加载的对象放入ListItem。

有人可以帮我这个吗?尝试寻找好的例子或教程,但我还没有找到真正有用的东西......

1 个答案:

答案 0 :(得分:1)

使用preexecute方法中的新列表创建适配器。将该适配器设置为列表视图。

然后在doInBackground中读取数据库,创建适合列表的对象,但不要添加它们。作为publishprogress方法的参数后,将每个对象作为参数。

在onProgressUpdate中,将对象添加到列表中,并通知适配器数据集已更改。

以下是我如何阅读推特电话的示例。

private class parseTwitterTask extends AsyncTask<Void, TCListObject2, List<TCListObject2>> {
    TCListObjectAdapter2 adapter;
    List<TCListObject2> list;

    @Override
    protected void onPreExecute() {
        list = new ArrayList<TCListObject2>();
        ListView lv = (ListView)findViewById(R.id.twitterlist);
        adapter = new TCListObjectAdapter2(list);
        lv.setAdapter(adapter);
        super.onPreExecute();
    }

    @Override
    protected List<TCListObject2> doInBackground(Void... params) {
        try {
            String url = social.get("twittersearchurl");//"http://search.twitter.com/search.json?q=" + social.get("twitter");
            String json = Internet.request(url, null);
            JSONObject jo = new JSONObject(json);
            if(jo.has("results")) {                 
                JSONArray ar = jo.getJSONArray("results");
                for(int i = 0; i < ar.length(); i++) {
                    TCListObject2 tweet = new TCListObject2();
                    JSONObject jobj = (JSONObject) ar.get(i);
                    tweet.id = "false";
                    tweet.img = jobj.getString("profile_image_url");

                    String text = jobj.getString("text");
                    text = Html.fromHtml(text).toString();
                    tweet.params.put(R.id.sub2, text);

                    String name = jobj.getString("from_user");
                    name = Html.fromHtml(name).toString();
                    tweet.params.put(R.id.text, name);

                    String time = jobj.getString("created_at");
                    tweet.params.put(R.id.sub1, Converter.timeToTimeAgo(time));

                    try {
                        tweet.time = new Date(time);
                    } catch(Exception e) {
                        e.printStackTrace();
                    }

                    tweet.celLayout = R.layout.cell_tweetobject;
                    publishProgress(tweet);
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
        }

        return list;
    }

    @Override
    protected void onProgressUpdate(TCListObject2... values) {
        list.add(values[0]);
        adapter.notifyDataSetChanged();
        super.onProgressUpdate(values);
    }