Java 使用新创建的项目返回到上一个活动时更新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>>{

我正在开发一个基于房间数据库的应用程序来管理我的训练

这里我有一个带有适配器的recyclerview,用于训练中的锻炼。 我目前的问题是,在创建新练习并切换回训练活动后,新练习不会显示在recyclerview中

这似乎是一个相当简单的话题(从其他活动返回后更新recyclerview),但我无法让它工作

  • 创建训练活动时的初始训练负荷:

    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)