Я работаю над приложением чата.ChatFragment имеет chatList, который получает данные из базы данных Firebase в реальном времени и добавляет один за другим элемент, используя childEventListener (onChildAdded).
Когда изменение ориентации или пользователь покидают фрагмент, я хочу сохранить полученный ChatList, удалитьпрослушиватель, а затем повторно присоединить прослушиватель, когда пользователь возвращается к фрагменту чата или когда изменение ориентации завершено.
Проблема в том, что при повторном создании действия / фрагмента childEventListener был потерян, поэтому я должен повторносоздать нового слушателя.Но затем chatList был продублирован, потому что был вызван onChildAdded и снова добавлен весь элемент.
Я пытался
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Но это не сработало, он все еще вызывал onChildAdded.И затем, каждый запрос, использующий singleValueEventListener, не будет работать должным образом, поскольку он запрашивает кэшированные данные, а не базу данных реального времени.
Я думаю о сравнении элемента chatList с элементом, который был получен в onChildAdded, если он существует,просто пропустите это.Но это довольно бесполезное время, и не то, что я хочу сделать: сохранить текущие данные, не нужно перезагружать базу данных Firebase, а также сохранить прослушиватель для нового элемента.
Или я могу сохранить весь прослушиватель и получитьэто как-то не знаю.
Вот код моей деятельности и фрагмент
В HomeActivity - код для сохранения фрагмента в связку
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (chatListFragment.isAdded())
getSupportFragmentManager().putFragment(outState, ChatListFragment.TAG, chatListFragment);
}
Затем я возвращаю его обратно в onCreate ().Здесь все поля фрагмента были потеряны: chatList, listener ...
if(getSupportFragmentManager().getFragment(savedInstanceState, ChatListFragment.TAG) != null) {
chatListFragment = getSupportFragmentManager().getFragment(savedInstanceState, ChatListFragment.TAG);
}
В ChatFragment я сохраняю список чата в связке
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(KEY_CHAT_LIST, chatList);
outState.putInt(KEY_CURRENT_POSITION, currentItemPosition);
//TODO: save data
}
И возвращаю его обратно на onActivityCreated()
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null) {
chatList = savedInstanceState.getParcelableArrayList(KEY_CHAT_LIST);
currentItemPosition = savedInstanceState.getInt(KEY_CURRENT_POSITION);
chatListAdapter.setChatList(chatList);
chatListAdapter.notifyDataSetChanged();
//the method below gets data from firebase DB by creating a
//childEventListener, that mean it gets all the chat item again
//but if I don't call it, I can't listen to onChildAdded :((
//presenter.loadChatList(chatList);
} else {
chatList.clear();
chatListAdapter.setChatList(chatList);
chatListAdapter.notifyDataSetChanged();
presenter.loadChatList(chatList);
}
}
Короче говоря, я хочу сохранить как данные, так и все прослушиватели Firebase для нового элемента / измененного элемента при перезапуске / повторном создании действия / фрагмента без использования setPersistenceEnabled (правда).
Извините за мой плохой английский.Большое вам спасибо.