0

TwitterからツイートをロードするAsyncTaskがあります。PullToRefresh ListViewもあります...プルして更新すると、リストビューはすぐにクリアされ、データが読み込まれるとすぐにリストビューに入力されます。

私のアプリには他のListViewがあり、すべて同じものがあります(PullToRefreshと非同期データの読み込み...)。他のListViewでは、これは発生しません。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);
    }
4

2 に答える 2

1

これについてはよくdoInBackgroundわかりませんが、AsyncTaskのメソッドで実行していlistTweets.clear();ます。結果を取得した後、それにデータを追加しています。これが問題を引き起こしている可能性があります。

于 2012-08-06T10:46:26.370 に答える
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());
}
于 2012-12-06T11:24:13.547 に答える