2017-05-15 2 views
1

は(正確に私のニーズを満たしていないHow can I refresh a previous activity after the back button is pressed?またはBack button and refreshing previous activity、のようないくつかの似質問があります。)私は2つのアクティビティを抱えているリロードデータアクティビティのライフサイクルに戻ったときに

  • PhotoListActivity:この活動には、複数の写真を表示RecyclerViewPhotoListAdapter<ArrayList<PhotoModel>>が含まれています。
  • PhotoDetailActivity:このアクティビティは1枚の写真を表示します。

問題:ユーザーがPhotoListActivityから始まり、写真をクリックしてPhotoDetailActivityで終わる。どちらのアクティビティでも、ユーザーは写真を気に入ることができます。写真が好きであれば、そのようなものが保存されているサーバーへのリクエストが発生します。 PhotoDetailActivityの写真が好きで、戻るボタンを押したときに、PhotoListActivityとそれに対応するPhotoListAdapter<ArrayList<PhotoModel>>は、アダプターのデータに「not-liked」の写真が含まれているため、 。

更新されたデータを表示するにはどうすればよいでしょうか?

  1. リロードonResume/onRestart方法
  2. でサーバからPhotoListAdapter<ArrayList<PhotoModel>>のデータがPhotoListAdapter<ArrayList<PhotoModel>>のArrayListを介してPhotoDetailActivity、ループから更新PhotoModelバックパスと対応PhotoModelを更新します。
  3. 好きな写真のリストを保持するローカルキャッシュ(静的にも、SharedPrefsでも)があります。ユーザーが写真を好む/好きになるたびに、そのキャッシュを更新することができます。次に、PhotoListActivityで今行わなければならないことは、特定の写真のキャッシュエントリが設定されているかどうかをチェックし、PhotoModelのものの代わりに同様の値を使用することです。その利点は、更新されたPhotoModelを常に周回する必要はないということです。

我々は別のサーバリクエストを行う必要はありませんので、第2の解決策は、明らかに好適であるが、それは一種のループに「ハック」PhotoListAdapter<ArrayList<PhotoModel>>ているようだとのマッチングPhotoModelを更新します。

アンドロイドでこれを解決する方法はありますか?

を編集し、可能な3番目の解決方法を追加しました。

+0

をあなたはStartActivityForResultを使用し、意図に –

答えて

1

解決策2と@Rajeshのソリューションを組み合わせると思います。リストをループする必要はありません。PhotoModelと一緒に位置インデックスを渡すと、ArrayListで更新する位置を正確に知ることができます。

ステップPhotoListActivity 1内側

PhotoDetailActivityを起動し、ArrayListの中PhotoModel &その位置に沿って通過します。

Intent intent = new Intent(this, PhotoDetailActivity.class); 
intent.putExtra("photoModel", myPhotoModel); 
intent.putExtra("photoModelPosition", position); // = represents the index of array 
startActivityForResult(intent, PHOTO_DETAIL_ACTIVITY); //int const that you choose 

ステップ2

ユーザーが終了すると/背中押すPhotoDetailActivity、内部/あなたの状態が何であれ、呼び出し元のアクティビティに返されるように更新PhotoModelと位置情報を準備します

if (photoModelChanged) { //Your condition here.. 
    int originalPos = getIntent().getExtras().getInt("photoModelPosition"); 

    Intent intent = new Intent(); 
    intent.putExtra("photoModel", updatedPhotoModel); 
    intent.putExtra("photoModelPosition", originalPos); 
    setResult(RESULT_OK, intent); 
    finish(); 
} 

ステップ3

PhotoListActivityの中には、onActivityResultをオーバーライドし、更新済みPhotoModelを既存のArrayListに実装します。あなたがしたい場合は、あなたのアダプタのnotifyItemChangedを呼び出すことができます。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == PHOTO_DETAIL_ACTIVITY) { 
     if (resultCode == RESULT_OK) { 
      PhotoModel updatedModel = data.getExtras() 
        .getSerializable("photoModel"); //I assume your class is serializable? 
      int pos = data.getExtras().getInt("photoModelPosition"); 

      //Update the activity's ArrayList<PhotoModel> 
      this.arrayList.set(pos, updatedModel); 

      //Notify the PhotoListAdapter with the change 
      this.adapter.notifyItemChanged(pos); 
     } 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 
+0

おかげで、あなたのモデルを渡し、あなたのリストを更新することができ、私はこのようなトンをやってしまいました。 – Chris

関連する問題