-1

arraylist データのアダプターを作成するメイン アクティビティがあります。Jsoup で別のスレッドを使用して、Web サイトからニュースを読みました。

onCreate() で私は持っています

this.newsItemAdapter = new NewsItemAdapter(this, 
                       R.layout.newsitem_row,NewsItemAdapter.getAllNews()); 
parseThread.start();
this.newsItemAdapter.notifyDataSetChanged();

アダプターから読み取ると、空のリストが表示されます。これは、スレッドがまだ完了していないためです。どのように進めるべきかについて何か考えはありますか?

アダプターの所有者ではないため、スレッド内で notifyDataSetChanged を実行できません。

4

2 に答える 2

0

アダプターをコンストラクターでスレッドに渡します。その後、スレッドは notifyDataSetChanged を呼び出すことができます。

于 2013-01-20T01:06:33.137 に答える
0

別のスレッドが終了した後に通知し、UI スレッドで notifyDataSet を呼び出す必要があります。1 つの可能な方法は、ハンドラーを使用することです。

次のように、アクティビティでハンドラーを定義し、handleMessage で notifyDataSet の変更を呼び出すことができます。

handler = new android.os.Handler() {
        @Override
        public void handleMessage(Message msg) {
            newsItemAdapter.notifyDataSetChanged();
        }
}

スレッド実行メソッドでは、ハンドラーにメッセージを送信する必要があります。

public void run() {
   // add this to the end
   Message msg = new Message()
   handler.sendMessage(msg);
}

または、別のスレッドの代わりに AsyncTask を使用し、タスクの doInBackground メソッドで jsoup を使用し、onPostExecute で notifyDataSet を使用できます。

ハンドラー ドキュメントはhttp://developer.android.com/reference/android/os/Handler.htmlで、AsyncTask はhttp://developer.android.com/reference/android/os/AsyncTask.htmlです。

于 2013-01-20T01:15:09.313 に答える