【问题标题】:How to add items separated by time delay to listview如何将按时间延迟分隔的项目添加到列表视图
【发布时间】:2015-08-26 14:51:31
【问题描述】:

我有一个 listView,如代码所示,我添加了从 0 到 9 的 10 个值。但我想做的是添加“i”的第一个值,然后等待 2 秒, 然后将“i”的下一个值添加到列表中。

我尝试使用以下代码执行此操作,但在运行时,应用程序等待 20 秒“2 秒/迭代”,然后一次显示所有值,这是我不想要的。 我希望 for 循环中的每次迭代都被添加到 listView 并在其中看到,然后应用程序应该等待 2 秒,然后在 循环到列表等等!

请指导我如何做到这一点?

代码

btn_Start.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            for (int i = 0; i < 10; i++) {
                adapter.add(""+i);
                adapter.notifyDataSetChanged();
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }
    });

【问题讨论】:

  • 你不应该阻塞你的主线程(Thread.Sleep),而是使用 Handler 或 AsyncTask。
  • @UdiI 很好,但我使用 adapter.notifyDataSetChanged();它应该显示列表视图中数据集发生的变化
  • 您在使用 adapter.notifyDataSetChanged() 后立即阻塞了 UI 线程;你不应该那样做。
  • 使用处理程序来更改 UI,将主线程置于睡眠状态会冻结 UI,这不是一个好习惯。处理程序在这里解释了最好的方法youtube.com/watch?v=LJ_pUlWzGsc

标签: android multithreading listview


【解决方案1】:

最适合您的情况是使用AsyncTask。只需将您的代码放入 doInBackground() 并在 onProgressUpdate() 中为适配器添加新值

【讨论】:

  • AsyncTask 对于如此简单的事情来说太过分了。
  • 提供一些论据比?
  • 您提供了一些论据。您如何证明启动线程只是为了在 UI 中进行一些小的更改?
  • 问题是你没有试着想得更宽泛,为什么这家伙需要每 2 秒添加一个项目?因为他试图模拟网络延迟,接下来他要做的就是放网络代码。使用您的 handler.postDelayed 您将获得一个非线程安全的预定执行!
【解决方案2】:

试试这个:

final Handler handler = new Handler();

final Runnable runnable = new Runnable() {
        @Override
        public void run() {

            int count = 0;

            if(count != 10){

            }else{
                handler.postDelayed(this, 2000);

                count++
            }
        }
    };

    Button btn_start = (Button)findViewById(R.id.fab_updates);
    btn_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            handler.postDelayed(runnable, 0);

        }
    });

【讨论】:

  • 你的想法是对的,但逻辑有点混乱。除此之外,您在run() 中初始化count,所以它永远不会是0 以外的任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多