2016-06-11 64 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

相關問題