Java 使用新创建的项目返回到上一个活动时更新recyclerView适配器
我正在开发一个基于房间数据库的应用程序来管理我的训练 这里我有一个带有适配器的recyclerview,用于训练中的锻炼。 我目前的问题是,在创建新练习并切换回训练活动后,新练习不会显示在recyclerview中 这似乎是一个相当简单的话题(从其他活动返回后更新recyclerview),但我无法让它工作Java 使用新创建的项目返回到上一个活动时更新recyclerView适配器,java,android,android-activity,android-recyclerview,Java,Android,Android Activity,Android Recyclerview,我正在开发一个基于房间数据库的应用程序来管理我的训练 这里我有一个带有适配器的recyclerview,用于训练中的锻炼。 我目前的问题是,在创建新练习并切换回训练活动后,新练习不会显示在recyclerview中 这似乎是一个相当简单的话题(从其他活动返回后更新recyclerview),但我无法让它工作 创建训练活动时的初始训练负荷: class GetExercises extends AsyncTask<Long, Void, List<Exercise>>{
- 创建训练活动时的初始训练负荷:
class GetExercises extends AsyncTask<Long, Void, List<Exercise>>{ @Override protected List<Exercise> doInBackground(Long... params){ if (params.length == 0 || params.length > 1) return null; return DatabaseClient .getInstance(getApplicationContext()) .getAppDatabase().exerciseDao() .getReferenced(params[0]); } protected void onPostExecute(List<Exercise> exerciseList){ super.onPostExecute(exerciseList); rv_exercises.setAdapter(new Adapter_Exercise_RV(Activity_Workout_Edit.this, exerciseList)); } }
我确实觉得“notifyDataSetChanged”不起作用,但找不到原因?问题是,在下一个活动中,您将向db插入一个项,并返回其id,但在
onActivityResult
中,您没有将该项添加到适配器,您需要做的是获取插入db的项,使用exerciseId
,然后将该项添加到适配器,然后调用以通知适配器
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK){
long exerciseId = (long) data.getExtras().get("exerciseId");
GetExerciseById(exerciseId).execute();
}
}
任务以获取插入的实体
class GetExerciseById extends AsyncTask<Long, Void, Exercise>{
long exerciseId=0;
GetExerciseById(long exerciseId){
this.exerciseId=exerciseId;
}
@Override
protected Exercise doInBackground(Long... params){
if (this.exerciseId == 0) return null;
return DatabaseClient
.getInstance(getApplicationContext())
.getAppDatabase().exerciseDao()
.getExcerciseById(exerciseId);
}
protected void onPostExecute(Exercise exercise){
super.onPostExecute(exerciseList);
if(exercise==null) return;//no item found with given id;
if(rv_exercises.getAdapter() instanceof Adapter_Exercise_RV )
{
Adapter_Exercise_RV adapter = (Adapter_Exercise_RV )rv_exercises.getAdapter();
adapter.addItem(exercise);
}
}
}
在你的刀里
@Query("SELECT * FROM exercises WHERE workoutId:=exerciseId")//relative names and ids
Exercise getExcerciseById(long exerciseId)
非常感谢你的回答,它很有魅力!之前已尝试asyncTask获取该项,但我错过了将其写回适配器的部分。
class GetExerciseById extends AsyncTask<Long, Void, Exercise>{
long exerciseId=0;
GetExerciseById(long exerciseId){
this.exerciseId=exerciseId;
}
@Override
protected Exercise doInBackground(Long... params){
if (this.exerciseId == 0) return null;
return DatabaseClient
.getInstance(getApplicationContext())
.getAppDatabase().exerciseDao()
.getExcerciseById(exerciseId);
}
protected void onPostExecute(Exercise exercise){
super.onPostExecute(exerciseList);
if(exercise==null) return;//no item found with given id;
if(rv_exercises.getAdapter() instanceof Adapter_Exercise_RV )
{
Adapter_Exercise_RV adapter = (Adapter_Exercise_RV )rv_exercises.getAdapter();
adapter.addItem(exercise);
}
}
}
void addItem(Exercise exercise){
yourDatalist.add(exercise);
notifyItemInserted(yourDatalist.size()-1);
}
@Query("SELECT * FROM exercises WHERE workoutId:=exerciseId")//relative names and ids
Exercise getExcerciseById(long exerciseId)