【问题标题】:How to get list generating in different thread and populate in the listview?如何在不同的线程中生成列表并填充到列表视图中?
【发布时间】:2014-03-26 07:49:55
【问题描述】:

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

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.setAdapter(适配器)” 我只想让列表每隔 X 秒自动加载一次新数据。 这应该怎么做?

【问题讨论】:

  • 您正在另一个线程中更新 UI..这是不可接受的..使用处理程序而不是计时器..
  • 您不应更改适配器,而应编辑其数据。这可以在任何线程中完成。
  • @Pietu1998 但在更新适配器数据后,我应该再次设置适配器......并且在相同的时间间隔内。
  • @donison24x7 你应该有一个对适配器的引用,并在更改数据而不是设置适配器后调用 notifyDataSetChanged(),参考:developer.android.com/reference/android/widget/…
  • 没有。适配器的全部目的是在您更新数据时自动更新视图。

标签: android multithreading listview


【解决方案1】:

以下应该可以解决线程问题:

listView.post(new Runnable() {              
   @Override
   public void run() {
       listView.setAdapter(adapter);

   }
});

它将在listView线程->主线程中执行

但皮图是对的:

您不应更改适配器,而应编辑其数据。这是可以做到的 在任何线程中。

这家伙解释的很好,搜索“notifyDataSetChanged()”:

http://www.vogella.com/tutorials/AndroidListView/article.html

【讨论】:

  • 阅读此答案:“@donison24x7 您应该参考适配器并调用 notifyDataSetChanged() 而不是设置适配器,参考:developer.android.com/reference/android/widget/...”更改数组或其他数据中的数据,然后调用 notifyDataSetChanged() 来“重新加载”它。
【解决方案2】:

首次设置您的 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多