2015-04-12 88 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经过时间。这个问题更具视觉特色 –