Recyclerview воссоздается, когда воссоздается фрагмент, выходящий на передний план - PullRequest
1 голос
/ 30 апреля 2020

У меня есть фрагмент, который имеет RecyclerView, показывающий список от наблюдателя, который наблюдает за изменениями в данных списка из комнаты db. Это работает так - FragmentA имеет список RecyclerView, и когда пользователь щелкает элемент, он открывает (заменяет) другой FragmentB, который является фрагментом детализации списка, где пользователь может редактировать элемент детализации списка и сохранять его (обновлять в db), и LiveData выполнит свою работу и обновит список. Но когда я нажимаю кнопку «Назад», представление FragmentA воссоздается, и другой идентичный наблюдатель подписывается, как показано в коде ниже -

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setupUI(view);

    viewModel.getInspections().observe(this, inspectionsList -> {
        setUpMainAdapter(inspectionsList); //setting Recyclerview adapter on recyclerview.
    })
}

Я нашел решение этой проблемы в этой статье , где написано использовать getViewLifecycleOwner() вместо this, чтобы наблюдатели также отписывались при изменении иерархии представления фрагмента. Теперь моя проблема в том, что, если я вернусь к FragmentA из FragmentB, снова будет вызван setUpMainAdapter(), и в обзоре утилизатора устанавливается новый адаптер. Пока я проверяю старый экземпляр адаптера еще жив. Если я сделаю adapter.notifyItemChanged(position), то это не сработает, и в окне переработчика нечего показать (потому что представление было воссоздано). Итак, правильная ли здесь настройка адаптера для ресивлера? Потому что странно настраивать основной адаптер снова и снова, и он не может использовать методы уведомления адаптера, чтобы просто обновить элемент.

1 Ответ

1 голос
/ 30 апреля 2020

используйте getViewLifecycleOwner() вместо этого, чтобы наблюдатели также отписывались при изменении иерархии представления фрагментов.

Это принципиально. Когда вы регистрируете наблюдателя в других системах, таких как Rx Java, вам всегда нужно отменить его в конце концов. С LiveData владелец жизненного цикла сделает это за вас. Но когда вы используете this в качестве владельца жизненного цикла, наблюдатели удаляются только при уничтожении фрагмента, а не при уничтожении представления! Таким образом, вы получите множество наблюдателей, ссылающихся на разрушенные представления, что приведет к утечкам памяти.

Итак, правильная ли настройка адаптера для просмотра в режиме повторного использования?

Я обычно создаю свои адаптеры в onViewCreated, но я думаю, что вам будет хорошо использовать старый адаптер, если вы обязательно установите его снова в своем новом RecyclerView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...