Основная цель - сделать список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();
}
Вы имеете в виду этот андроид: configChanges = «ориентация | keyboardHidden | Размер экрана»>, к сожалению, его не работайте для меня, деятельность должна воссоздаваться по ротации. Спасибо за ваш ответ! –
Затем используйте Пакет. Сохраняйте и восстанавливайте важные значения оттуда –
Я уже их использую, но я не показывал этот код, потому что моя проблема заключается не в сохранении данных, а в сохранении данных. Почему первый элемент listView подсчитывает прошедшее время - это моя проблема. Я не могу понять, почему при использовании адаптера метода getView(), расположенного в позиции 1 или 2 после holder.chronometer.setBase (base); инициализируйте по истечении времени позиции 0. Эта проблема более визуальна. –