如何在不同的线程中生成列表并填充listview?

时间:2014-03-26 07:49:56

标签: android multithreading listview

我有一个非常大的列表,我将其设置为在不同的线程中生成。

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秒自动加载一次新数据。 应该怎么做?

2 个答案:

答案 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。