2016-06-11 74 views
2

我是android新手。我正在创建一个竞赛应用程序,其中包含一个包含该事件状态的ListView。无论是否开始。当前时间超过事件开始时间时应自动更新。如何根据当前时间和事件开始时间更新listItem的textview

我使用的是AsyncTask,但它不是很准确。

@Override 
public View getView(final int position, View view, ViewGroup parent) { 
    LayoutInflater scheduleInflater = LayoutInflater.from(getContext()); 
    final Holder h; 
    if(view == null){ 
     view = scheduleInflater.inflate(R.layout.custom_list , parent , false); 
     h = new Holder(); 

     h.eventName=(TextView) view.findViewById(R.id.eventNameCustomList); 
     h.eventStatus=(TextView) view.findViewById(R.id.eventStatus); 
     h.leftTime = (TextView) view.findViewById(R.id.leftTime); 
     h.rightTime= (TextView) view.findViewById(R.id.rightTime); 
     view.setTag(h); 

    }else{ 
     h = (Holder) view.getTag(); 
    } 

    final data d = getItem(position); 

    h.eventName.setText(d.getEventName()); 

    Date startDate= d.getStartDate(); 
    Date endDate = d.getEndDate(); 

    long stTime = startDate.getTime(); 
    long now = System.currentTimeMillis(); 

    if(now >= stTime) {h.eventStatus.setText(Html.fromHtml(startedText));} 
    else {h.eventStatus.setText(Html.fromHtml(upcomingText));} 


    h.eventStatus.setTag(String.valueOf(position)); // Setting Tag of each TextView to its position to avoid incorrect ayncTask update 
    new go(h.eventStatus).execute(d.getStartDate()); // starting a thread to update the Text view 
    return view; 
} 


public class go extends AsyncTask<Date, Void , Boolean> { 

    String path; 
    TextView status; 
    public go(TextView eventStatus){ 
     this.status=eventStatus; 
     this.path=eventStatus.getTag().toString(); 
    } 


    @Override 
    protected Boolean doInBackground(Date... params) { 
     Date startDate = params[0]; 
     while(true){ 
      long curTime = System.currentTimeMillis(); 
      long startTime = startDate.getTime(); 
      if (curTime >= startTime) {return true;} 
     } 
    } 

    @Override 
    protected void onPostExecute(Boolean b) { 
     if(!status.getTag().toString().equals(path)) return; 
     if(b!=null && status!=null){ 
      if(b==true) status.setText(Html.fromHtml(startedText)); 
      else status.setText(Html.fromHtml(upcomingText)); 
     }else{ 
      status.setText(Html.fromHtml(upcomingText)); 
     } 
    } 

} 

static class Holder{ 
    TextView eventName , eventStatus; 
    TextView leftTime, rightTime; 
} 

如何更新在当前时间超过开始时间TextView来启动。请帮助并提出更好的解决方案。

+0

'其中包含event'的状态做你的意思是listview显示的是事件列表? '但它不是很准确'请在这里定义准确。另外,柜台是否继续滴答,例如20分钟等等? – Sufian

+0

Listview有许多事件,它在每个显示状态的项目中都有一个textview。状态:即将到来或状态:已启动。 Asynctask让我的应用程序更慢 – Arun

回答

0

您的应用程序变慢的原因是因为您不必要地在while(true)内部运行检查,这会花费太多资源并使整个设备变慢。

更好的方法是在延迟一段时间后执行更新操作,即时间到了。

遵循以下步骤:

  1. 保持时间对事件在某种列表/阵列/地图的开始(保持时间相对),
  2. 使用android.os.Handler与延迟执行代码。类似下面(用毫秒取代timeInMillis活动开始后):

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         adapter.notifyDataSetChanged(); 
        } 
    }, timeInMillis); 
    
+0

在哪里写定时器代码。因为我想根据时间更新listItem的textview。你可以提供在哪里写这个,因为我是Android新手。我应该在getView中写这些吗? – Arun

+0

'Handler.postDelayed()'会在上述时间后触发提供的'Runnable',请参阅[docs here](https://developer.android.com/reference/android/os/Handler.html#postDelayed(了java.lang.Runnable,%20long))。您将在设置Listview的适配器后编写该代码。 **不要**在'getView()'中创建这些东西,因为只有当一个项目被显示时才会调用它! – Sufian

0

这是更好地使用TimerTimerTask就象这样:

final Handler handler = new Handler(); 
Timer timer = new Timer(false); 
TimerTask timerTask = new TimerTask() { 
    @Override 
    public void run() { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       // My check to do every second 
      } 
     }); 
    } 
}; 
timer.schedule(timerTask, 1000); // 1000 = 1 second. 
+0

'TimerTask'有它的问题(请[看这里](http://stackoverflow.com/questions/20330355/timertask-or-handler)),除了你在这个(包括'Handler')中创建3个对象,所以它不会更好。 – Sufian

相关问题