旋转屏幕时自定义适配器的奇怪行为

时间:2015-04-12 20:52:00

标签: java android chronometer

主要目标是使用计时器制作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();
            }

1 个答案:

答案 0 :(得分:0)

尝试将其放在清单文件上,记住将名称和标签更改为通讯员:

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