2015-04-12 136 views
0

主要目標是使用計時器製作listVeiw,然後轉動屏幕以保存每個計時器的狀態。但是當我運行計時器並轉動屏幕時,無論哪個計時器總是第一項。它沒有正式啓動,但伯爵開始了。下面是代碼片段:旋轉屏幕時自定義適配器的奇怪行爲

if(row==null){ 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(resorceID,parent,false); 
     holder = new TrackHolder(); 
     holder.name = (TextView)row.findViewById(R.id.row_name); 
     holder.chronometer = (Chronometer)row.findViewById(R.id.row_chronometer); 
     holder.start = (Button)row.findViewById(R.id.btStart); 
     holder.stop = (Button)row.findViewById(R.id.btStop); 
     row.setTag(holder); 
    }else{ 
     holder = (TrackHolder)row.getTag(); 
    } 
    if(!trackerList.isEmpty()) { 

     final TrackHolder finalHolder = holder; 
     holder.start.setEnabled(true); 
     holder.stop.setEnabled(false); 

     if(bundle!=null){ 

      holder.name.setText(tracker.getName()); 
      elapsedTime = bundle.getLong("elapsedTime "+position);//получеаем значение прошедшего времени после поворота экрана 
      base = bundle.getLong("base " + position);//получаем, сохраненную на пред экране. 
      lastPause[0]=bundle.getLong("lastPause " + position);//получаем разницу во времени(паузу) с SavedInstanceState 
      bundleIsItStart=bundle.getBoolean("start " + position);//получаем статус: запущен/остановлен 
      basesList.set(position,base); 

      if(elapsed.get(position)<elapsedTime)//если время, полученое после поворота больше, которое насчитает в onTick, запишется в список, но такого никогда не будет 
       elapsed.set(position, elapsedTime); 
      if(startList.get(position)==bundleIsItStart)//по аналогии как выше, если если текущий элемент == статусу, пишем в список статус, иначе элемент остается в списке 
       startList.set(position,bundleIsItStart); 
      if(lastPauseList.get(position)>lastPause[0]) 
       lastPauseList.set(position,lastPause[0]); 

      if(bundleIsItStart){ 
       holder.stop.setEnabled(true); 
       holder.start.setEnabled(false); 
       holder.chronometer.setBase(base); 
       holder.chronometer.start(); 
      } 


     }else{ 

      holder.name.setText(tracker.getName()); 
      holder.start.setEnabled(true); 
      holder.stop.setEnabled(false); 
     } 
     holder.start.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finalHolder.chronometer.setBase(SystemClock.elapsedRealtime() + lastPause[0]); 
       finalHolder.chronometer.start(); 
       finalHolder.stop.setEnabled(true); 
       finalHolder.start.setEnabled(false); 
       basesList.set(position, finalHolder.chronometer.getBase()); 
       startList.set(position,true); 
      } 
     }); 
     holder.stop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       lastPause[0]=finalHolder.chronometer.getBase()-SystemClock.elapsedRealtime(); 
       finalHolder.chronometer.stop(); 
       finalHolder.start.setEnabled(true); 
       finalHolder.stop.setEnabled(false); 
       lastPauseList.set(position,lastPause[0]); 
       startList.set(position,false); 
      } 
     }); 
     holder.chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { 
      @Override 
      public void onChronometerTick(Chronometer chronometer) { 
        elapsed.set(position, SystemClock.elapsedRealtime() - finalHolder.chronometer.getBase()); 
        Log.d("myTag", "elapsedTime = " + getTime(elapsed.get(position)) + "position = " + position); 

      } 
     }); 
    } 
    return row; 
} 

我在第二項調試運行了很多的時間這條線後,在這裏,例如,我們把在那裏,onTick當您將光標移動到調試模式中的位置,它顯示0個元素並寫入elapsedTime。我刪除了onTick的方法,但第一個元素仍然保持時間。

if(bundleIsItStart){ 
       holder.stop.setEnabled(true); 
       holder.start.setEnabled(false); 
       holder.chronometer.setBase(base); --- after this 
       holder.chronometer.start(); 
      } 

回答

0

嘗試把這個在清單文件,記住要更改名稱和標籤記者:

<activity android:name=".MyActivity" 
android:configChanges="orientation|keyboardHidden" 
android:label="@string/app_name"> 
+0

你的意思是這個機器人:configChanges =「方向| keyboardHidden |屏幕尺寸」>,遺憾的是其不爲我工作,應該輪流重新創建活動。謝謝您的回答! –

+0

然後使用Bundle。從那裏存儲和恢復重要值 –

+0

我已經使用它們,但我沒有顯示此代碼,因爲我的問題不在保存數據,數據正在保存正確。爲什麼listView的第一項計算經過的時間 - 這是我的問題。我不明白爲什麼當適配器方法getView()位於1或2位置holder.chronometer.setBase(base)後;初始化位置0經過時間。這個問題更具視覺特色 –