2015-04-12 2 views
0

Основная цель - сделать списокVeiw с хронометрами, и вы поворачиваете экран, чтобы сохранить состояние каждого таймера. Но когда я запускаю хронометр и поворачиваю экран, неважно, из какого таймера всегда будет первый элемент. Он официально не был запущен, но начался отсчет. Вот фрагмент коды:Странное поведение пользовательского адаптера при повороте экрана

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 элемент и пишет expapsedTime. Я удалил метод 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

Затем используйте Пакет. Сохраняйте и восстанавливайте важные значения оттуда –

+0

Я уже их использую, но я не показывал этот код, потому что моя проблема заключается не в сохранении данных, а в сохранении данных. Почему первый элемент listView подсчитывает прошедшее время - это моя проблема. Я не могу понять, почему при использовании адаптера метода getView(), расположенного в позиции 1 или 2 после holder.chronometer.setBase (base); инициализируйте по истечении времени позиции 0. Эта проблема более визуальна. –

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