我有一个非常大的列表,我将其设置为在不同的线程中生成。
Thread t = new Thread(new Runnable() {
@Override
public void run() {
getTheList(); //a method in my class which generates Arraylist<> list.
}
});
t.start();
现在我使用Timer任务来填充列表,每5秒填充一次。
class task extends TimerTask {
public void run() {
ArrayList<HashMap<String, String>> list = ListViewActivity.this.getList();
String[] from = {"date","sname","bname","contrno","item","quantity","rate"};
int[] to = {R.id.textViewSRdate,R.id.textViewSRSname,R.id.textViewSRBname,R.id.textViewSRcontrNo,R.id.textViewSRitem,R.id.textViewSRquantity,R.id.textViewSRrate};
adapter = new SimpleAdapter(getApplicationContext(), list ,R.layout.some_row, from, to);
listView.setAdapter(adapter);
}
}
Timer timer = new Timer();
timer.schedule(new task(), 5000, 3000);
它说“只有创建视图层次结构的原始线程才能触及其视图。”当我想在任务类中为我的listview设置适配器。 “listView.setAdapter(适配器)” 我只希望列表每隔X秒自动加载一次新数据。 应该怎么做?
答案 0 :(得分:3)
以下内容适用于线程问题:
listView.post(new Runnable() {
@Override
public void run() {
listView.setAdapter(adapter);
}
});
它将在listView线程中执行 - &gt;主线
但是Pietu是对的:
您不应更改适配器,但要编辑其数据。那可以做到 在任何线程中。
这些家伙解释得很好,搜索&#34; notifyDataSetChanged()&#34;:
http://www.vogella.com/tutorials/AndroidListView/article.html
答案 1 :(得分:0)
首次设置ListView并启动以下计时器。您可以设置以毫秒为单位的间隔,并且将定期调用 onTick 功能并设置间隔。
new CountDownTimer(total_duration_in_millis, Interval_in_millis) {
@Override
public void onTick(long arg0) {
//code to get updated list
adapter.notifyDataSetChanged();
}
@Override
public void onFinish() {
//optional
}
};
使用ListActivity更好地扩展您的活动类,以便您可以使用 SetListAdapter()方法填充列表,而无需通过id访问ListView。