Избежать повторной инициализации activity в onResume

483
04 января 2017, 01:46

Допустим, у нас приложение для просмотра заметок с использованием фрагментов и 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 через параметр, но вероятно, это не лучшее решение).

Answer 1

Сделайте переход на новую activity с помощью метода startActivityForResult. На новой activity отправляйте при добавление данных в БД можете добавить в intent все id записей которые вы добавили, и при выходе из этой активити передавать в MainActivity. А в методе onActivityResult доставать эти записи по id из бд и добавлять их в список, при этом обновлять RecyclerView либо по позициям добавления, либо весь список полностью

READ ALSO
Экзаменационное задание по программированию на Java [требует правки]

Экзаменационное задание по программированию на Java [требует правки]

Добрый день, есть образец экзаменационного задания по программированию на JavaМожно ли получить совет, с чего начинать и в каком направлении...

456
Обращение к определенному тегу xml

Обращение к определенному тегу xml

Имеется xml с множеством элементовНекоторые элементы имеют одинаковое название но дочерние элементы могу отличаться

469
Индикатор слайда bxslider [требует правки]

Индикатор слайда bxslider [требует правки]

Как переместить индикаторы текущего слайдера на само изображение, а не под ним? Пример на скриншоте:

460