如何使用意图打开可以具有不同ListView内容的活动?

时间:2018-01-03 03:39:37

标签: android

我正在开发一款可以创建健身房锻炼计划的应用程序。我的主要活动包括ListView(常规ArrayAdapter),每个项目都是一周中的某一天。单击一个项目时,将打开第二个活动,其中有EditTexts输入练习的名称和代表数量,以及另一个ListView(自定义适配器,称为exerciseAdapter),用于当天要执行的练习。还有一个“添加”按钮,可将输入的练习信息添加到ListView。我想要做的是,对于按下的每个不同日期,第二个活动有一个不同的显示ListView,因为一周中不同的日子可以有不同的健身房时间表但我的应用程序当前显示任何一天按下的相同时间表。我知道我需要使用一个intent来传递被点击的ListView项的位置,但我不知道在第二个活动中如何处理该意图。

这是我主要活动的代码:

public class MainActivity extends AppCompatActivity {

ListView listView;

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

    listView = findViewById(R.id.listView);
    ArrayList<String> daysOfWeek = new ArrayList<>();
    daysOfWeek.add("Monday");
    daysOfWeek.add("Tuesday");
    daysOfWeek.add("Wednesday");
    daysOfWeek.add("Thursday");
    daysOfWeek.add("Friday");
    daysOfWeek.add("Saturday");
    daysOfWeek.add("Sunday");

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, daysOfWeek);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            Intent intent = new Intent(getApplicationContext(), WorkoutActivity.class);
            intent.putExtra("position", position);
            startActivity(intent);
        }
    });
}

}

这是第二个活动的onCreate的代码:

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

    dbExercises = FirebaseDatabase.getInstance().getReference("exercises");

    Intent intent = getIntent();
    index = intent.getIntExtra("position", -1);

    exerciseNameET = findViewById(R.id.exerciseNameET);
    setsET = findViewById(R.id.setsET);
    repsET = findViewById(R.id.repsET);
    restTimeET = findViewById(R.id.restTimeET);
    addButton = findViewById(R.id.addButton);
    exerciseList = findViewById(R.id.exerciseList);

    exercises = new ArrayList<>();

    exerciseAdapter = new ExerciseList(WorkoutActivity.this, exercises);
    exerciseList.setAdapter(exerciseAdapter);

    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            addExercise();
        }
    });
}

更新:我尝试传递一个字符串而不是一个整数,并在一周中的每一天使用一个练习的ArrayList。根据传递的字符串值,我将相应的ArrayList应用于数组适配器。但是,无论在主活动中点击的星期几,第二个活动中都会显示相同的锻炼计划ListView。

public class WorkoutActivity extends AppCompatActivity {

String day;

EditText exerciseNameET;
EditText setsET;
EditText repsET;
EditText restTimeET;
Button addButton;

ExerciseList exerciseAdapter;
//ArrayList<Exercise> exercises;
ArrayList<Exercise> monExercises;
ArrayList<Exercise> tueExercises;
ArrayList<Exercise> wedExercises;
ArrayList<Exercise> thuExercises;
ArrayList<Exercise> friExercises;
ArrayList<Exercise> satExercises;
ArrayList<Exercise> sunExercises;
ListView exerciseList;

DatabaseReference dbExercises;

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

    dbExercises = FirebaseDatabase.getInstance().getReference("exercises");

    Intent intent = getIntent();
    day = intent.getStringExtra("day");

    exerciseNameET = findViewById(R.id.exerciseNameET);
    setsET = findViewById(R.id.setsET);
    repsET = findViewById(R.id.repsET);
    restTimeET = findViewById(R.id.restTimeET);
    addButton = findViewById(R.id.addButton);
    exerciseList = findViewById(R.id.exerciseList);

    //exercises = new ArrayList<>();
    monExercises = new ArrayList<>();
    tueExercises = new ArrayList<>();
    wedExercises = new ArrayList<>();
    thuExercises = new ArrayList<>();
    friExercises = new ArrayList<>();
    satExercises = new ArrayList<>();
    sunExercises = new ArrayList<>();

    //exerciseAdapter = new ExerciseList(WorkoutActivity.this, exercises);
    //exerciseList.setAdapter(exerciseAdapter);

    if(day.equals("Monday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, monExercises);
    } else if(day.equals("Tuesday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, tueExercises);
    } else if(day.equals("Wednesday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, wedExercises);
    } else if(day.equals("Thursday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, thuExercises);
    } else if(day.equals("Friday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, friExercises);
    } else if(day.equals("Saturday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, satExercises);
    } else if(day.equals("Sunday")) {
        exerciseAdapter = new ExerciseList(WorkoutActivity.this, sunExercises);
    }
    exerciseList.setAdapter(exerciseAdapter);

    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            addExercise();
        }
    });
}

@Override
protected void onStart() {
    super.onStart();
    dbExercises.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //exercises.clear();
            if(day.equals("Monday")) {
                monExercises.clear();
            } else if(day.equals("Tuesday")) {
                tueExercises.clear();
            } else if(day.equals("Wednesday")) {
                wedExercises.clear();
            } else if(day.equals("Thursday")) {
                thuExercises.clear();
            } else if(day.equals("Friday")) {
                friExercises.clear();
            } else if(day.equals("Saturday")) {
                satExercises.clear();
            } else if(day.equals("Sunday")) {
                sunExercises.clear();
            }
            for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Exercise exercise = postSnapshot.getValue(Exercise.class);
                //exercises.add(exercise);
                if(day.equals("Monday")) {
                    monExercises.add(exercise);
                } else if(day.equals("Tuesday")) {
                    tueExercises.add(exercise);
                } else if(day.equals("Wednesday")) {
                    wedExercises.add(exercise);
                } else if(day.equals("Thursday")) {
                    thuExercises.add(exercise);
                } else if(day.equals("Friday")) {
                    friExercises.add(exercise);
                } else if(day.equals("Saturday")) {
                    satExercises.add(exercise);
                } else if(day.equals("Sunday")) {
                    sunExercises.add(exercise);
                }
            }
            //exerciseAdapter.updateExerciseList(exercises);
            if(day.equals("Monday")) {
                exerciseAdapter.updateExerciseList(monExercises);
            } else if(day.equals("Tuesday")) {
                exerciseAdapter.updateExerciseList(tueExercises);
            } else if(day.equals("Wednesday")) {
                exerciseAdapter.updateExerciseList(wedExercises);
            } else if(day.equals("Thursday")) {
                exerciseAdapter.updateExerciseList(thuExercises);
            } else if(day.equals("Friday")) {
                exerciseAdapter.updateExerciseList(friExercises);
            } else if(day.equals("Saturday")) {
                exerciseAdapter.updateExerciseList(satExercises);
            } else if(day.equals("Sunday")) {
                exerciseAdapter.updateExerciseList(sunExercises);
            }
            exerciseAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

addExercise()代码:

private void addExercise() {
    String name = exerciseNameET.getText().toString();
    try {
        int sets = Integer.parseInt(setsET.getText().toString());
        int reps = Integer.parseInt(repsET.getText().toString());
        int restTime = Integer.parseInt(restTimeET.getText().toString());

        if((!TextUtils.isEmpty(name)) && (!TextUtils.isEmpty(setsET.getText().toString())) && (!TextUtils.isEmpty(repsET.getText().toString())) && (!TextUtils.isEmpty(restTimeET.getText().toString()))) {
            String id = dbExercises.push().getKey();
            Exercise exercise = new Exercise(id,name,sets,reps,restTime);
            dbExercises.child(id).setValue(exercise);
            exerciseNameET.setText("");
            setsET.setText("");
            repsET.setText("");
            restTimeET.setText("");
        }
    } catch(NumberFormatException e) {
        Toast.makeText(this, "All fields are required. Please complete the missing fields.", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

练习课代码:

public class Exercise {
private String id;
private String name;
private int sets;
private int reps;
private int restTime;

public Exercise() {}

public Exercise(String name, int sets, int reps, int restTime) {
    this.name = name;
    this.sets = sets;
    this.reps = reps;
    this.restTime = restTime;
}

public Exercise(String id, String name, int sets, int reps, int restTime) {
    this.id = id;
    this.name = name;
    this.sets = sets;
    this.reps = reps;
    this.restTime = restTime;
}

public String getId() {
    return id;
}

public String getName() {
    return name;
}

public int getSets() {
    return sets;
}

public int getReps() {
    return reps;
}

public int getRestTime() {
    return restTime;
}

}

2 个答案:

答案 0 :(得分:0)

而不是传递位置为什么不传递String值,如日(星期日,星期一......)那样,通过检查第二个Activity中的数据,您可以确定哪种视图在那里设置。如果您可以从第二个Activity

确定第一个Activity中该位置的数据,您也可以通过该位置

如果不清楚,请随时要求澄清。

答案 1 :(得分:0)

创建简单的类名DayOfWeek,如下所示

static final class DayOfWeek {
    public static final int MONDAY = 0;
    public static final int TUESDAY = 1;
    //...
}

并在您的第二个活动中

Intent intent = getIntent();
index = intent.getIntExtra("position", -1);
switch (index) {
        case DayOfWeek.MONDAY:
            // your logic here
            break;
        case DayOfWeek.TUESDAY:
            // your logic here
            break;
        default:
            // case -1
            break;
}
添加addExercise()Exercise

的代码后,

更新

我认为原因是您没有将从MainActivity传递的日期与数据库中的运动所属的日期进行比较。因此,在for(DataSnapshot postSnapshot : dataSnapshot.getChildren())中,无论当天是星期一,星期二,......你都将所有相同的练习(在数据库中)放到列表中。

尝试我的解决方案

  1. 在练习模型课程中,创建新的字段名称private String day

    public class Exercise {
       // another fields
       private String day; // this filed save the day exercise belong to
    
       public Exercise(String id, String name, int sets, int reps, int restTime, String day) {
          this.id = id;
          this.name = name;
          this.sets = sets;
          this.reps = reps;
          this.restTime = restTime;
          this.day = day;
      }
    
      public String getDay() {
          return day;
      }
    }
    
  2. 无需像ArrayList<>()monExercieses那样创建那么多tueExercises,......这就是冗余。只创建一个ArrayList<Exercise> exercises;

  3. 现在在onDataChange(DataSnapshot dataSnapshot)方法

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        exercises.clear();
    
        for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
             Exercise exercise = postSnapshot.getValue(Exercise.class);
             // At the certain time, you have only one case of day ( monday, tuesday, ...)
             // You only need to compare it with the exercise in the database
            if(day.equals(exercise.getDay())) {
                exercises.add(exercise);
            }
        }
    
       exerciseAdapter.updateExerciseList(exercises);
       exerciseAdapter.notifyDataSetChanged();
    }
    
  4. 希望有所帮助!