私はアイテムのリストを表示するアプリケーションを開発しており、ユーザーはアイテムを追加してアイテムの詳細を確認することができます。Firebaseデータベースを使用してアクティビティを再開するときにデータを適切に復元する方法は?
ChildEventListener
リスナーonResume()
を追加し、onPause()
にそれらを取り除く、のは、私が活動中で、私のデータベース参照を保持するとしましょう:これらChildEventListener
で
public void onResume() {
super.onResume();
mItemChildEventListener = mDatabaseReference.child('items').addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
mAdapter.addItem(dataSnapshot.getValue(Item.class));
}
...
};
}
public void onPause() {
super.onPause();
if (mItemChildEventListener != null) {
mDatabaseReference.removeEventListener(mItemChildEventListener);
}
}
、私はアイテムのリストに項目によってアイテムを追加していると、アダプタにnotifyItemInserted(itemArray.size() - 1)
を呼び出します。
public void addItem(Item item) {
if (mItems == null) {
mItems = new ArrayList<>();
}
mItems.add(item);
notifyItemInserted(mItems.size() - 1);
}
はまた、スムーズに実行中のアプリケーションを維持するために、私はこれはonSaveInstanceState()
値の保存とonCreate()
にそれらを復元し、Reteiner Fragmentに項目のリストを保持しています。
onResume()
が呼び出される
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null) {
mItems = getState(STATE_ITEMS);
} else {
mItems = new ArrayList<>();
}
mAdapter = new ItemAdapter(mItems);
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveState(STATE_ITEMS, mItems);
}
public <T> T getState(String key) {
//noinspection unchecked
return (T) mRetainedFragment.map.get(key);
}
public void saveState(String key, Object value) {
mRetainedFragment.map.put(key, value);
}
public static class RetainedFragment extends Fragment {
HashMap<String, Object> map = new HashMap<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
}
、再度ChildEventListener
を添加することにより、同じデータが検索されます。これは、項目リストに既に含まれているデータと比較されない場合は、mItems
と重複します。
また、mItems
の項目のリストを保持せずに、onResume()
が呼び出されるたびにデータを取得すると、リストのスクロール位置が失われ、データの取得に時間がかかるため点滅します。
質問
は、どのように私は再びそれらを再度取得せずに検索された項目のリストを保持しますが、既に取得したアイテムの変更をして、コメントを追加新しいアイテムのために聞いておくことができますか?すでに検索されたアイテムを新しいアイテムと比較するよりも、たとえばそのキーによって解決する方が良いでしょうか?
私はドキュメントやその他の質問を調べてみましたが、この状況に関連する情報は見つかりませんでした。また、項目mItems
のリストで行ったように、mDatabaseReference
の参照をonSaveInstanceState()
に保存しようとしましたが、どちらも機能しませんでした。
@rewgoes DatabaseHelperクラスがあり、データをArrayListにロードすることができる場合は、View HolderとしてRecyclerAdapterを使用していますか?それで、UpdateまたはDeleteを追加するときにDBを移動する必要があるだけです。私はSqliteで使用するMVP設計です – Grendel
@grendel、私はDatabaseHelperを使用していません。私のデータベースは完全にfirebaseリアルタイムデータベースに基づいています。 – rewgoes
@MarianoCórdobaこれらのパターンだけでは、OPが経験している問題を必ずしも助けるわけではありません。このように構築したインフラストラクチャは、データモデルレイヤーを保持するために何か特別なことをしない限り、構成の変更ごとに引き裂かれて再作成される可能性があります。 –