编辑:使用 TextWatcher 和 ROOM 数据库,RecyclerView 项目 EditText 在写入新值后不会更改默认值

问题描述 投票:0回答:1

编辑:添加了 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 .如果您能帮我解决这个问题,我将不胜感激。祝你有美好的一天,谢谢! :)

java android android-recyclerview android-room
1个回答
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);

}
© www.soinside.com 2019 - 2024. All rights reserved.