【问题标题】:Update TextView using Timer and ArrayList使用 Timer 和 ArrayList 更新 TextView
【发布时间】:2016-04-23 07:15:56
【问题描述】:

我正在编写一个小程序,每 5 秒更新一次 TextView。但我无法每 5 秒更新一次 textview 的文本,尤其是当涉及到最后一个数组列表项时,例如:下面代码中的 C

我在关注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());
     }
     }});
   }}

【问题讨论】:

  • 不是迭代列表,你为什么不设置TextView一次一个Text。
  • 不要使用定时器任务,它不能正常工作,使用处理程序。
  • 在哪里调用 timer.start() 方法来启动 Timer。
  • 我正在使用这个教程:android-er.blogspot.in/2013/12/…
  • 您的 TextView 是否总是显示列表的最后一项?

标签: java android for-loop arraylist timer


【解决方案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++;

            }
        });
    }


}

【讨论】:

  • 抱歉,我以为你想一次又一次地显示列表项。我已经再次编辑了我的答案,现在它只会显示每个项目一次,并且当最后一个项目显示给您时,计时器将停止。 @孙
  • 不,我想一次又一次地显示列表项,先显示 a-z 然后再显示 a-z 等等...请更新您的代码
  • @Sun 我的代码和你想要的完全一样。我在发布之前已经对此进行了测试,现在我也对其进行了测试。如果问题再次出现。用这个 MyTimerTask 类更新你的问题。
【解决方案2】:

这里我有一些代码片段,它只是在每 5 秒后更新 Textview。

第 1 步: 首先,您只是在制作一个单独的方法,其中 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);

希望你对我的想法很清楚。

祝你好运

【讨论】:

    【解决方案3】:

    您应该使用Handler 而不是使用TimerTask 来更新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); 
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      不要在每次调用 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++;
                  });
             }
          }
      }
      

      【讨论】:

      • @Sun 我刚刚在您的代码中修改了几行。上面的代码你看懂了吗?
      • @Sun 你只需要修改MyTimerTask 类而不是所有代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2013-01-20
      • 2017-07-21
      • 2015-07-20
      相关资源
      最近更新 更多