几秒钟后自动将项目添加到Listview

时间:2016-11-20 12:59:11

标签: android listview

我想做的是(类似):

for(i=0;i<20;i++) {
    list.add(i);
    listview.setAdapter(...);
    //equivalent sleep method
}

数秒将在几秒钟后动态添加到Listview中。 到目前为止我做了什么:

int i = 1;
    while (i<20) {
        generate(i);

        Handler handler = new Handler();

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (list != null && list.size() > 0) {
                    listView.setAdapter(new MyCustomAdapter(context,list));
                } else if (list.size() == 0) {

                }
            }
        }, 10000);
        i++;
    }

但几秒钟后所有数字都会立刻显示出来。在java中,我每次都通过向框架添加面板来实现它。我该怎么做Android?

2 个答案:

答案 0 :(得分:1)

您使用相同的延迟时间同时发布所有延迟,因此它们将同时运行。 简单的解决方法是将10000值更改为10000 * i。更正确的修复方法是仅发布一个runnable,并且runnable本身发布下一个。这样,你一次没有所有可运行的内存 此外,从您的代码中不清楚您将项目添加到列表中的位置。看起来你是在循环中添加它,而不是在runnable中添加它,所以它们在第一次runnable运行之前都已经在列表中。你应该将它移动到runnable。此外,您不应为每次迭代创建新的适配器。您应该将适配器更改为具有名为addItem()的函数,并将该项添加到其列表中,然后调用notifyDatasetChanged

答案 1 :(得分:0)

我想这就是你要找的东西。你需要注意一些变量的范围。

Handler handler = new Handler();

MyCustomAdapter myCustomAdapter = new MyCustomAdapter(context,list);
listView.setAdapter(myCustomAdapter);
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        generate(i);
        if (i < 20) {
            if (list != null && list.size() > 0) {
                list.add(String.valueOf(i));
                myCustomAdapter.notifyDataSetChanged();
                handler.postDelayed(this, 10000);
            } else if (list.size() == 0) {

            }
            i++;
        } else {
            handler.removeCallbacks(this);
        }
    }

};
handler.post(runnable);