【问题标题】:Update recyclerView Adapter on return to previous activity with newly created item使用新创建的项目返回到以前的活动时更新 recyclerView 适配器
【发布时间】:2021-01-24 12:01:41
【问题描述】:

我正在开发一款基于房间数据库管理我的锻炼的应用程序。

在这里,我有一个带有适配器的 recyclerview,用于在锻炼中进行练习。 我目前的问题是新的练习在创建它们并切换回锻炼活动后没有显示在回收视图中。

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

  • 锻炼活动的 onCreate 的初始负荷:

    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));
          }
      }
    
  • 创建一个新的练习并将 id 返回到之前的锻炼活动:

    class CreateExercise extends AsyncTask<Void, Void, Void> {
          long id;
          @Override
          protected Void doInBackground(Void... voids) {
    
              Exercise ex = new Exercise();
              ex.setTitle(sTitle);
              ex.setSet(sSet);
              ex.setRep(sRep);
              ex.setAsTimer(bAsTimer);
    
              ex.setWorkoutId(workoutId);
    
              id = DatabaseClient.getInstance(getApplicationContext())
                  .getAppDatabase()
                      .exerciseDao()
                      .insertwithRet(ex);
              return null;
      }
    
          @Override
          protected void onPostExecute(Void aVoid) {
              super.onPostExecute(aVoid);
              finish(id);
              Toast.makeText(getApplicationContext(), "created new exercise", Toast.LENGTH_LONG).show();
          }
      }
      new CreateExercise().execute();
    
  • 在锻炼活动中更新适配器 onActivityResult

    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");
          rv_exercises.getAdapter().notifyDataSetChanged();
      }
    }
    

该练习已在数据库中创建,重新打开该练习后,新练习将正确显示。 我确实感觉“notifyDataSetChanged”不起作用,但找不到原因?

【问题讨论】:

    标签: java android android-activity android-recyclerview


    【解决方案1】:

    问题是,在下一个活动中,您将一个项目插入到 db,并返回其 ID,但在 onActivityResult 中,您没有将项目添加到适配器,您需要做的是获取项目使用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);
             }
          }
      }
    

    在您的Adapter_Exercise_RV 班级中

    void addItem(Exercise exercise){
      yourDatalist.add(exercise);
      notifyItemInserted(yourDatalist.size()-1);
    }
    

    在你的 DAO 中

    @Query("SELECT * FROM exercises WHERE workoutId:=exerciseId")//relative names and ids
    Exercise getExcerciseById(long exerciseId)
    

    【讨论】:

    • 非常感谢您的回答,它就像一个魅力!之前已经尝试过 asyncTask 来获取该项目,但我错过了您将其写回适配器的部分。
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多