【问题标题】:Moving in a for-loop on button click在按钮单击时进入 for 循环
【发布时间】:2019-04-18 09:24:59
【问题描述】:

我正在尝试在我的 Android 应用程序中创建一个活动,该活动通过锻炼运行先前创建的锻炼锻炼。这个活动基本上是从意图中获取锻炼,从数据库中创建锻炼项目的 ArrayList,然后遍历 ArrayList。

问题在于 runInReps 和 runInTime 方法。 runInTime 应该获取练习(作品)的持续时间并创建一个倒计时持续时间。完成后,它应该显示 Done,并且当单击 nextRep 按钮时移动到另一组(或者如果没有剩下的,下一个练习 - 在 run 方法中完成)。这不起作用 - while 循环变得无限,无法退出它。而且计时器甚至永远不会启动。

runInReps 应该做类似的事情,只是没有计时器 - 在完成一组时,您应该单击按钮并移动到下一组。一旦没有剩余的集合,您应该进行下一个练习(在 run 方法中完成)。

你能指出我正确的方向吗? 谢谢!

package android.tomdoischer.workOutDroid;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class runWorkout extends AppCompatActivity {
    String workoutName;
    int setsRemaining;
    DatabaseHelperExercise db;

    TextView runNameOfExercise;
    TextView timeOrRepsRemaining;
    TextView exerciseRemaining;
    TextView reps;
    Button nextRep;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_run_workout);


        workoutName = getIntent().getStringExtra("WORKOUT_NAME");

        runNameOfExercise = findViewById(R.id.runNameOfExercise);
        timeOrRepsRemaining = findViewById(R.id.timeOrRepsRemaining);
        exerciseRemaining = findViewById(R.id.exerciseRemaining);
        nextRep = findViewById(R.id.nextRep);
        reps = findViewById(R.id.reps);

        System.out.println("reached ifs");

        if(workoutName != null) {
            System.out.println("reached run");
            run();
        } else {
            Toast.makeText(this, "You have not selected a workout!", Toast.LENGTH_LONG).show();
        }
    }

    public void run() {
        // a method which reads individual workoutItems from the database and returns an ArrayList
        // of workoutItems
        ArrayList<WorkoutItem> workoutItems = createRunnableWorkout(workoutName);

        System.out.println("array created");
        // length of the workout
        int length = workoutItems.size();
        int count = 0;


        // running the whole arraylist item by item
        for (WorkoutItem item : workoutItems) {
            System.out.println("running item");
            if (item.getExercise().isMeasureTime()) {
                count++;
                exerciseRemaining.setText(String.format("%s / %s", String.valueOf(count), String.valueOf(length)));
                runInTime(item);
            } else {
                count++;
                exerciseRemaining.setText(String.format("%s / %s", String.valueOf(count), String.valueOf(length)));
                runInReps(item);
            }
        }

        // jumps to the finished workout activity, saves the workout name
        Intent newIntent = new Intent(runWorkout.this, runWorkoutDone.class);
        newIntent.putExtra("WORKOUT_NAME", workoutName);
        startActivity(newIntent);
    }

    public ArrayList<WorkoutItem> createRunnableWorkout(String workoutName) {
        ArrayList<WorkoutItem> workoutItems = new ArrayList<>();

        db = new DatabaseHelperExercise(this);

        Cursor data = db.getDataWorkoutItems(workoutName);

        if (data.getCount() == 0) {
            Toast.makeText(this, "This workout is empty!", Toast.LENGTH_LONG).show();
        } else {
            while (data.moveToNext()) {
                WorkoutItem workoutItem = new WorkoutItem();

                boolean inTime;
                if(data.getInt(5) == 1) {
                    inTime = true;
                } else {
                    inTime = false;
                }

                workoutItem.setExercise(new Exercise(data.getString(2),inTime));
                workoutItem.setSets(data.getInt(3));

                if (workoutItem.getExercise().isMeasureTime()) {
                    workoutItem.setTime(data.getInt(4));
                } else {
                    workoutItem.setReps(data.getInt(4));
                }

                workoutItems.add(workoutItem);
            }
        }

        return workoutItems;
    }

    public void runInTime(WorkoutItem item) { //todo fix me
        // next button not pressed yet
        System.out.println("running runintime");
        setsRemaining = item.getSets();
        System.out.println("setsremaining " + setsRemaining);

        // set text fields
        runNameOfExercise.setText(item.getExercise().getName());
        reps.setText(String.valueOf(item.getReps()));
        timeOrRepsRemaining.setText(String.valueOf(setsRemaining));
        System.out.println("text set");

        nextRep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setsRemaining--;
            }
        });
        System.out.println("onclicklistener set");


        while (setsRemaining > 0) {
            System.out.println("in the while loop");
            CountDownTimer cTimer = new CountDownTimer(item.getTime() * 1000, 1000) {
                public void onTick(long millisUntilFinished) {
                    System.out.println("ontick");
                    timeOrRepsRemaining.setText(String.format("%s s", Long.toString(millisUntilFinished / 1000)));
                    System.out.println("ontick finished");
                }

                public void onFinish() {
                    System.out.println("finished");
                    timeOrRepsRemaining.setText("Done!");
                }
            };
            cTimer.start();
            cTimer.cancel();
        }
    }

    public void runInReps(WorkoutItem item) { //todo fix me
        // next button not pressed yet
        System.out.println("running runinreps");
        setsRemaining = item.getSets();

        // set text fields
        runNameOfExercise.setText(item.getExercise().getName());
        reps.setText(String.format("%s reps", String.valueOf(item.getReps())));

        nextRep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setsRemaining--;
            }
        });

        while (setsRemaining >0) {
            timeOrRepsRemaining.setText(String.format("%s sets", String.valueOf(setsRemaining)));
        }
    }
}

【问题讨论】:

    标签: java android for-loop


    【解决方案1】:

    因此,如果有人遇到同样的问题,那么问题实际上在于尝试在 for- 或 while- 循环中遍历 ArraýList。这实际上不是我想要实现的 - 我想在按钮单击时移入 ArrayList。

    查看固定代码了解更多详情:

    package android.tomdoischer.workOutDroid;
    
    import android.content.Intent;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.os.CountDownTimer;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    public class runWorkout extends AppCompatActivity {
        String workoutName;
        int setsRemaining;
        boolean inTime;
        int move;
        int length;
        int count;
        DatabaseHelperExercise db;
        ArrayList<WorkoutItem> workoutItems;
    
        TextView runNameOfExercise;
        TextView timeOrRepsRemaining;
        TextView exerciseRemaining;
        TextView reps;
        Button nextRep;
        Button nextEx;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_run_workout);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // keeps the screen on
    
            workoutName = getIntent().getStringExtra("WORKOUT_NAME");
    
            runNameOfExercise = findViewById(R.id.runNameOfExercise);
            timeOrRepsRemaining = findViewById(R.id.timeOrRepsRemaining);
            exerciseRemaining = findViewById(R.id.exerciseRemaining);
            nextRep = findViewById(R.id.nextRep);
            nextEx = findViewById(R.id.nextEx);
            reps = findViewById(R.id.reps);
    
            System.out.println("reached ifs");
    
            if(workoutName != null) {
                System.out.println("reached run");
                run();
            } else {
                Toast.makeText(this, "You have not selected a workout!", Toast.LENGTH_LONG).show();
            }
        }
    
        public void run() {
            // a method which reads individual workoutItems from the database and returns an ArrayList
            // of workoutItems
            workoutItems = createRunnableWorkout(workoutName);
    
            System.out.println("array created");
            // length of the workout
            length = workoutItems.size();
            move = 0;
    
            setUpTextViews(move);
        }
    
        public ArrayList<WorkoutItem> createRunnableWorkout(String workoutName) {
            ArrayList<WorkoutItem> workoutItems = new ArrayList<>();
    
            db = new DatabaseHelperExercise(this);
    
            Cursor data = db.getDataWorkoutItems(workoutName);
    
            if (data.getCount() == 0) {
                Toast.makeText(this, "This workout is empty!", Toast.LENGTH_LONG).show();
            } else {
                while (data.moveToNext()) {
                    WorkoutItem workoutItem = new WorkoutItem();
    
                    boolean inTime;
                    if(data.getInt(5) == 1) {
                        inTime = true;
                    } else {
                        inTime = false;
                    }
    
                    workoutItem.setExercise(new Exercise(data.getString(2),inTime));
                    workoutItem.setSets(data.getInt(3));
    
                    if (workoutItem.getExercise().isMeasureTime()) {
                        workoutItem.setTime(data.getInt(4));
                    } else {
                        workoutItem.setReps(data.getInt(4));
                    }
    
                    workoutItems.add(workoutItem);
                }
            }
    
            return workoutItems;
        }
    
    
        public void onNextEx(View v) {
            move++;
            if(move<length) {
                setUpTextViews(move);
            } else {
                Intent newIntent = new Intent(runWorkout.this, runWorkoutDone.class);
                newIntent.putExtra("WORKOUT_NAME", workoutName);
                startActivity(newIntent);
            }
        }
    
        public void onNextSet(View v) {
            if (inTime) {
    
            } else {
                if(setsRemaining > 1) {
                    setsRemaining--;
                    timeOrRepsRemaining.setText(String.format("%s set(s)", String.valueOf(setsRemaining)));
                } else {
                    timeOrRepsRemaining.setText("Done!");
                }
            }
        }
    
        public void setUpTextViews(int move) {
            runNameOfExercise.setText(workoutItems.get(move).getExercise().getName());
    
            setsRemaining = workoutItems.get(move).getSets();
            inTime = workoutItems.get(move).getExercise().isMeasureTime();
    
            if(workoutItems.get(move).getExercise().isMeasureTime()) {
                reps.setText(String.valueOf(setsRemaining) + " set(s)");
                new CountDownTimer(workoutItems.get(move).time * 1000, 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        timeOrRepsRemaining.setText(millisUntilFinished / 1000 + " s");
                    }
    
                    @Override
                    public void onFinish() {
                        timeOrRepsRemaining.setText("Done!");
                    }
                }.start();
    
    
            } else {
                reps.setText(String.valueOf(workoutItems.get(move).getSets()) + " rep(s)");
                timeOrRepsRemaining.setText(String.valueOf(workoutItems.get(move).getReps()) + " set(s)");
            }
            exerciseRemaining.setText((move + 1) + " / " + length);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2016-08-14
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多