Допустим, у нас приложение для просмотра заметок с использованием фрагментов и RecyclerView. Заметки хранятся в БД.
Если мы напишем код фрагмента следующим образом:
private DataBase dataBase;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_notes, container, false);
MainActivity activity = (MainActivity)getActivity();
dataBase = new DataBase(activity);
activity.changeToolbarTitle(getText(R.string.notes_tabItem).toString());
getNotes(activity);
return view;
}
private void getNotes(MainActivity activity){
RecyclerView recyclerView = (RecyclerView) activity.findViewById(R.id.recycleView);
recyclerView.setLayoutManager(new LinearLayoutManager(activity));
recyclerView.setAdapter(new NotesAdapter(dataBase.getNotes()));
}
то после добавления новой записи в другой Activity и возврата в MainActivity, где в виде RecyclerView отображаются заметки, новой заметки не будет, пока не перезапустить приложение. Логично: ведь при возврате в MainActivity, где находится фрагмент, onCreateView() не вызывается, потому и вызова метода getNotes(activity), который получает свежую информацию из БД, тоже нет.
Однако, если учесть, что после onCreate() всегда вызывается onResume(), то почему бы не поместить вызов getNotes(activity) в onResume()?
private DataBase dataBase;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_notes, container, false);
MainActivity activity = (MainActivity)getActivity();
dataBase = new DataBase(activity);
activity.changeToolbarTitle(getText(R.string.notes_tabItem).toString());
return view;
}
@Override
public void onResume() {
super.onResume();
getNotes(activity);
}
Один экземпляр activity нам всё равно нужен в onCreateView для других целей ; мы его и создаём. Но он же нам нужен и в onResume() для вызова getNotes(), и в сам getNotes, для использования findViewByID и создания нового LinearLayoutManager.
Вопрос: можно инициализировать MainActivity только один раз или придётся это делать заново в onResume? (Что касается getNotes, то я передал activity через параметр, но вероятно, это не лучшее решение).
Сделайте переход на новую activity с помощью метода startActivityForResult. На новой activity отправляйте при добавление данных в БД можете добавить в intent все id записей которые вы добавили, и при выходе из этой активити передавать в MainActivity. А в методе onActivityResult доставать эти записи по id из бд и добавлять их в список, при этом обновлять RecyclerView либо по позициям добавления, либо весь список полностью
Сборка персонального компьютера от Artline: умный выбор для современных пользователей