2016-01-18 3 views
4

Я пишу небольшую программу для обновления TextView каждые 5 секунд. Но я не могу обновить текст моего TextView в каждые 5 секунд, особенно когда речь идет последний ArrayList элемент, как: C ниже в кодеОбновление TextView с использованием Timer и ArrayList

Я следую this учебник

public class MainActivity extends Activity { 

Timer timer; 
MyTimerTask myTimerTask; 
List<String> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textCounter = (TextView)findViewById(R.id.counter); 

    timer = new Timer(); 
    myTimerTask = new MyTimerTask(); 

    timer.schedule(myTimerTask, 1000, 5000); 

    .... 

    list = new ArrayList<String>(); 
    list.add("A"); 
    list.add("B"); 
    list.add("C"); 

} 

class MyTimerTask extends TimerTask { 

    @Override 
    public void run() { 

    runOnUiThread(new Runnable(){ 

    @Override 
    public void run() { 
    for(int i=0; i<list.size(); i++) { 
     textCounter.setText(list.get(i).toString()); 
    } 
    }}); 
    }} 
+0

Вместо списка перебора, почему бы вам не установить TextView с одним текстом в то время. –

+0

Не используйте задачу таймера, она работает неправильно, используйте для этого обработчик. –

+0

, где вы вызываете метод timer.start() для запуска таймера. –

ответ

2

Не перебирать список каждый раз вызывается метод run. Вместо этого получите один элемент из списка и установите его в TextView.

private int count =0; 
private class MyTimerTask extends TimerTask { 
    @Override 
    public void run() { 
     runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       textCounter.setText(list.get(count%list.size).toString()); 
       count++; 
      }); 
     } 
    } 
} 
+0

вы можете показать мне простым способом? – Sun

+0

@Sun Я только что изменил несколько строк в вашем коде. Вы поняли выше код? –

+0

@Sun Вам просто нужно изменить класс 'MyTimerTask' не весь код. –

1

Изменить MyTimerTask класс, как указано ниже.

private int position = 0; 

class MyTimerTask extends TimerTask { 

    @Override 
    public void run() { 

     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       if (position >= list.size()) { 
        position = 0; 
       } 

       textCounter.setText(list.get(position).toString()); 
       position++; 

      } 
     }); 
    } 


} 
+0

, к сожалению, остановился, когда дело доходит до последнего элемента ... – Sun

+0

Я отредактировал свой ответ, пожалуйста, проверьте сейчас. @Sun –

+0

теперь его единственный показ первого предмета arraylist .... – Sun

1

Вместо использования TimerTask Вы должны использовать Handler для обновления TextView.

Handler mHandler = new Handler(); 
final Runnable runnable = new Runnable() { 
    int count = 0; 
    @Override 
    public void run() { 
     count++; 
     textCounter.setText(list.get(count).toString()); 
     mHandler.postDelayed(this, 5000); // five second in ms 
    } 
}; 
mHandler.postDelayed(runnable, 1000); 

Надеюсь, это вам поможет.

1

здесь У меня есть фрагмент кода, который просто обновляет Textview через каждые 5 секунд.

Шаг 1: Сначала вы просто создаете один метод saperate, где Textview Update, как показано ниже.

private void updateTextView(){ 
    /** 
    * Write Your Textview Update Code 
    */ 

} 

Шаг 2 Объявите объект Runnable класса, который просто позвони метод updateTextview через какое-то определенное время.

Runnable run = new Runnable() { 

    @Override 
    public void run() { 

     updateTextView(); 

    } 
}; 

Шаг 3 вы можете начать этот работоспособный, используя следующий код.

YOUR_TEXTVIEW.postDelayed(run,5000); 

Надеюсь, вы поняли мою Идею.

Лучшие удач

Смежные вопросы