在AsyncTask完成之前清除列表

时间:2012-08-06 10:30:42

标签: android twitter android-listview

我有一个从Twitter加载推文的AsyncTask。 我还有一个PullToRefresh ListView ...每当我拉动刷新它时,listview立即清除,一旦数据加载,它就会被填充到列表视图中。

我的App中有其他ListViews都有相同的东西(PullToRefresh和Async数据加载...)。在其他ListViews上,这不会发生。仅限Twitter ListView。我做错了什么?

这是我的代码:

    public class TwitterDownloader extends AsyncTask<Void, Void, String> {

    final Handler mHandler = new Handler();

    public TwitterDownloader() {
    }

    @Override
    public void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {
        twitter4j.Twitter twitter = new TwitterFactory().getInstance();

        listTweets.clear();

            List<twitter4j.Status> statuses = null;

            try {
                statuses = twitter.getUserTimeline(
                        MainActivity.TWITTER_USERNAME, new Paging(1, 50));
            } catch (TwitterException e) {
                e.printStackTrace();
                Log.e(MainActivity.LOG_TAG, "TwitterException");
            }

            try {
                for (twitter4j.Status status : statuses) {
                    listTweets.add(status.getText());
                }
            } catch (NullPointerException npe) {
            }
        return null;
    }

    @Override
    public void onPostExecute(String unused) {
        MyCustomAdapter myAdapter = new MyCustomAdapter(myContext,
                R.layout.row_twitter, listTweets);
        setListAdapter(myAdapter);
        getListView().setTextFilterEnabled(true);

        String lastUpdate = (new SimpleDateFormat(
                "HH:mm")).format(new Date());

        pullToRefreshView.onRefreshComplete();
        pullToRefreshView.setLastUpdatedLabel(getString(R.string.last_updated) + ": "
                + lastUpdate);
    }

2 个答案:

答案 0 :(得分:1)

我不确定这一点,但在AsyncTask的doInBackground方法中,您正在执行listTweets.clear();。获得结果后,您将向其添加数据。可能这会造成问题。

答案 1 :(得分:0)

我最后通过在我再次填充列表之前添加所有clear()语句来修复它(在try catch中)。

因此,我的doInBackground方法中的新代码是:

try {
            listTweets.clear();
            listUsernames.clear();
            listDates.clear();
            listImageURLs.clear();
            listURLsOfTweets.clear();
            for (twitter4j.Status status : statuses) {
                listTweets.add(status.getText());
                listUsernames.add(status.getUser().getName());
                listDates.add(android.text.format.DateFormat
                        .getDateFormat(getApplicationContext()).format(
                                status.getCreatedAt())
                        + " "
                        + android.text.format.DateFormat.getTimeFormat(
                                getApplicationContext()).format(
                                status.getCreatedAt()));
                listImageURLs.add(status.getUser().getProfileImageURL()
                        .toString());

                StringBuffer address = new StringBuffer();
                address.append("http://twitter.com/#!/");
                address.append(status.getUser().getScreenName());
                address.append("/status/");
                address.append(status.getId());

                listURLsOfTweets.add(address.toString());
}