我想做的是(类似):
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?
答案 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);