编辑:添加了 SetDao 和 SetItem。
我有这个问题:我正在创建一个应用程序,用户在其中添加一个“集合”到练习中,当他单击“+”按钮时,它会在活动的集合列表中添加一个新的“集合”。 recyclerview 项目列表中有两个 edittext 字段: edittext_rep 和 edittext_weight ,您必须在其中写下您的组数和重量,并将值保存到房间,并在再次打开活动时显示您之前写入的值。我的活动代码如下:
public class Exercise extends AppCompatActivity {
TextView setAdd, exerciseName;
Button btnSetAdd;
RecyclerView recyclerView;
SetAdapter recyclerViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
setAdd = findViewById(R.id.textView_setAdd);
exerciseName = findViewById(R.id.textView_exerciseName);
btnSetAdd = findViewById(R.id.btnAddSet);
String selectedExerciseName = getIntent().getStringExtra("EXERCISE_NAME");
exerciseName.setText(selectedExerciseName);
initRecyclerView();
loadSetList();
loadSavedValues();
btnSetAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int rep = 0;
double weight = 0;
int exerciseId = getIntent().getIntExtra("EXERCISE_ID", -1);
addNewSet(rep, weight, exerciseId);
}
});
}
private void loadSavedValues() {
AppDatabase database = AppDatabase.getInstance(this.getApplicationContext());
int exerciseId = getIntent().getIntExtra("EXERCISE_ID", -1);
if (exerciseId != -1) {
List<SetItem> setsForExercise = database.setDao().getSetsForExercise(exerciseId);
recyclerViewAdapter.setSetList(setsForExercise);
setStoredValues(setsForExercise);
recyclerViewAdapter.notifyDataSetChanged();
} else {
Log.e("ExerciseActivity", "No exercise ID found in the intent");
}
}
private void setStoredValues(List<SetItem> setsForExercise) {
for (SetItem setItem : setsForExercise) {
setItem.setStoredRep(setItem.getRep());
setItem.setStoredWeight(setItem.getWeight());
}
}
private void loadSetList() {
AppDatabase database = AppDatabase.getInstance(this.getApplicationContext());
int exerciseId = getIntent().getIntExtra("EXERCISE_ID", -1);
if (exerciseId != -1) {
// Fetch exercises associated with the selected workout ID
List<SetItem> setsForExercise = database.setDao().getSetsForExercise(exerciseId);
recyclerViewAdapter.setSetList(setsForExercise);
} else {
Log.e("WorkoutActivity", "No workout ID found in the intent");
}
}
private void addNewSet(int rep, double weight, int exercise_id) {
int exerciseId = getIntent().getIntExtra("EXERCISE_ID", -1);
if (exerciseId != -1) {
AppDatabase database = AppDatabase.getInstance(this.getApplicationContext());
ExerciseItem exerciseItem = database.exerciseDao().getExerciseById(exerciseId);
if (exerciseItem != null) {
SetItem setItem = new SetItem();
setItem.setExercise_id(exercise_id);
setItem.setRep(rep);
setItem.setWeight(weight);
database.setDao().insertSetItem(setItem);
}
}
recyclerViewAdapter.addSet();
}
public void initRecyclerView() {
recyclerView = findViewById(R.id.recycler_sets);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
recyclerViewAdapter = new SetAdapter(this);
recyclerView.setAdapter(recyclerViewAdapter);
}
然后我有这个用于回收器视图的适配器:
public class SetAdapter extends RecyclerView.Adapter<SetAdapter.ViewHolder> {
private Context context;
private List<SetItem> setList;
public void addSet() {
setList.add(new SetItem());
notifyItemInserted(setList.size() - 1);
}
public void setSetList(List<SetItem> setList){
this.setList = setList;
notifyDataSetChanged();
}
public List<SetItem> getSetList(){
return setList;
}
public SetAdapter(Context context) {
this.context = context;
this.setList = new ArrayList<>();
}
@NonNull
@Override
public SetAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.list_sets, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SetAdapter.ViewHolder holder, int position) {
SetItem set = setList.get(position);
holder.textView_setNumber.setText(String.valueOf(position + 1));
holder.editText_rep.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count){
try {
int reps = Integer.parseInt(s.toString());
set.setRep(reps);
} catch (NumberFormatException e) {
// Handle invalid input if needed
}
}
@Override
public void afterTextChanged(Editable s) {
try {
int reps = Integer.parseInt(s.toString());
set.setStoredRep(reps);
Log.d("SetAdapter", "Stored Rep: " + set.getStoredRep()); // Log the stored rep
} catch (NumberFormatException e) {
// Handle invalid input if needed
}
}
});
holder.editText_rep.setText(String.valueOf(set.getStoredRep()));
Log.d("SetAdapter", "Stored Rep: " + set.getStoredRep());
holder.editText_weight.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
try {
double weight = Double.parseDouble(s.toString());
set.setWeight(weight);
} catch (NumberFormatException e) {
// Handle invalid input if needed
}
}
@Override
public void afterTextChanged(Editable s) {
try {
double weight = Double.parseDouble(s.toString());
set.setStoredWeight(weight);
Log.d("SetAdapter", "Stored Weight: " + set.getStoredWeight()); // Log the stored weight
} catch (NumberFormatException e) {
// Handle invalid input if needed
}
}
});
holder.editText_weight.setText(String.valueOf(set.getStoredWeight()));
Log.d("SetAdapter", "Stored Weight: " + set.getStoredWeight());
}
@Override
public int getItemCount() {
return setList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
TextView textView_setNumber;
EditText editText_rep, editText_weight;
public ViewHolder(@NonNull View itemView) {
super(itemView);
editText_rep = itemView.findViewById(R.id.editText_rep);
editText_weight = itemView.findViewById(R.id.editText_weight);
textView_setNumber = itemView.findViewById(R.id.textView_setNumber);
}
}
这是设置项:
@Entity(foreignKeys = @ForeignKey(entity = ExerciseItem.class,
parentColumns = "id",
childColumns = "exercise_id",
onDelete = ForeignKey.CASCADE))
public class SetItem {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "exercise_rep")
public int rep;
@ColumnInfo(name = "exercise_weight")
public double weight;
@ColumnInfo(name = "exercise_id")
public int exercise_id;
@ColumnInfo(name = "stored_rep")
public int storedRep;
@ColumnInfo(name = "stored_weight")
public double storedWeight;
public int getStoredRep() {
return storedRep;
}
public double getStoredWeight() {
return storedWeight;
}
public int getId() {
return id;
}
public int getRep() {
return rep;
}
public double getWeight() {
return weight;
}
public void setId(int id) {
this.id = id;
}
public void setExercise_id(int exercise_id) {
this.exercise_id = exercise_id;
}
public void setStoredRep(int storedRep) {
this.storedRep = storedRep;
}
public void setStoredWeight(double storedWeight) {
this.storedWeight = storedWeight;
}
public void setRep(int rep) {
this.rep = rep;
}
public void setWeight(double weight) {
this.weight = weight;
}
public int getExercise_id(){
return exercise_id;
}
}
这是 SetDao:
@Dao
public interface SetDao {
@Query("SELECT * FROM setitem WHERE exercise_id = :exerciseId")
List<SetItem> getSetsForExercise(int exerciseId);
@Insert
void insertSetItem(SetItem... setItems);
@Delete
void delete(SetItem setItem);
}
因此,当我打开活动时,edittext_rep和权重的默认值为0,当我写入任何其他值时,我在日志中看到它会更改storedRep/storedWeight,但是当我重新启动活动时,它会再次显示默认值 - 0 .如果您能帮我解决这个问题,我将不胜感激。祝你有美好的一天,谢谢! :)
所以我也有这个Appdatabase.java:
@Database(entities = {WorkoutItem.class, ExerciseItem.class, SetItem.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract WorkoutDao workoutDao();
public abstract ExerciseDao exerciseDao();
public abstract SetDao setDao();
private static AppDatabase INSTANCE;
public static AppDatabase getInstance(Context context) {
if(INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "DB_NAME")
.allowMainThreadQueries()
.build();
}
return INSTANCE;
}
}
WorkoutItem.java:
@Entity
public class WorkoutItem {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "workout_name")
public String workoutName;
public String getWorkoutName() {
return workoutName;
}
public int getId(){
return id;
}
}
WorkoutDao.java:
@Dao
public interface WorkoutDao {
@Query("SELECT * FROM workoutitem")
List<WorkoutItem> getAllWorkoutItems();
@Query("SELECT * FROM workoutitem WHERE id = :workoutId")
WorkoutItem getWorkoutById(int workoutId);
@Insert
void insertWorkoutItem(WorkoutItem... workoutItems);
@Delete
void delete(WorkoutItem workoutItem);
}
ExerciseItem.java:
@Entity(foreignKeys = @ForeignKey(entity = WorkoutItem.class,
parentColumns = "id",
childColumns = "workout_id",
onDelete = ForeignKey.CASCADE))
public class ExerciseItem {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "exercise_name")
public String exerciseName;
@ColumnInfo(name = "workout_id")
public int workoutId;
public int getId() {
return id;
}
public String getExerciseName() {
return exerciseName;
}
public int getWorkoutId() {
return workoutId;
}
}
ExerciseDao.java:
@Dao
public interface ExerciseDao {
@Query("SELECT * FROM exerciseitem WHERE workout_id = :workoutId")
List<ExerciseItem> getExercisesForWorkout(int workoutId);
@Query("SELECT * FROM exerciseitem WHERE id = :exerciseId")
ExerciseItem getExerciseById(int exerciseId);
@Insert
void insertExerciseItem(ExerciseItem... exerciseItems);
@Delete
void delete(ExerciseItem exerciseItem);
}