2016-11-20 4 views
0

То, что я хочу сделать, это (похоже):Добавить товары автоматически 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?

ответ

1

Вы отправляете все задержанные в одно и то же время с таким же отсроченным временем, поэтому все они будут выполняться в одно и то же время. Легкое исправление, заключается в изменении значения 10000, до 10000 * i. Чем правильнее было бы исправить ошибку, было бы опубликовать только одну runnable, а сам runnable, размещает следующую. Таким образом, вы не имеете одновременно все исполняемые файлы в памяти.
Кроме того, это не ясно из вашего кода, в котором вы добавляете элемент в список. Кажется, что вы добавляете его в цикле, а не в runnable, так что все они уже в списке перед запуском первого запуска. Вы должны переместить его в runnable. Кроме того, вам не следует создавать новый адаптер для каждой итерации. Вы должны изменить свой адаптер на функцию с именем addItem(), и она должна добавить элемент в свой список, а затем позвонить notifyDatasetChanged.

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); 
Смежные вопросы