фрагмент наблюдать за проблемой - PullRequest
0 голосов
/ 07 июня 2019

У меня возникла проблема с LiveData и Fragment Lifecycle.

Поток выглядит следующим образом:

  • 1-й фрагмент показывает обзор комментариев переработчика.Каждый комментарий имеет кнопку удаления.
  • 1-й фрагмент имеет кнопку меню, которая при нажатии перемещает пользователя на 2-й фрагмент для создания нового комментария.
  • Когда пользователь создает комментарийотображается диалог обратной связи и вызывается onBackPressed для отклонения 2-го фрагмента.
  • 1-й фрагмент обновляет список комментариев, чтобы показать изменения.

Посмотрите на фрагменты кода ниже.Метод observe вызывается для onCreateView.

1-го фрагмента фрагмента:

private void observe() {
    //getComments method observes the API response from the allComments method
    mainViewModel.getComments().observe(getViewLifecycleOwner(), resp -> {
        if (resp != null && resp.getStatus().equalsIgnoreCase("success")) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage("success message");
            builder.setPositiveButton("ΟΚ", (dialog, id) -> {
                dialog.dismiss();
                getActivity().onBackPressed();
            });
            builder.create().show();
        }
    });
}
mainViewModel.getCommentDelete().observe(getViewLifecycleOwner(), resp -> {
        if (resp != null && resp.getStatus().equalsIgnoreCase("success")) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage("Comment deleted.");
            builder.setPositiveButton("ΟΚ", (dialog, id) -> {
                dialog.dismiss();
            });
            builder.create().show();
            //allComments method makes an http call to the API to fetch comments
            mainViewModel.allComments(mainViewModel.getSelected().getId());
        }
    });

//initView. The adapter has a listener to listen for button clicks.
mAdapter = new BuildingCommentsAdapter(new RecyclerMultipleOptionsClick() {
        @Override
        public void onItemClicked(int position, int id) {
            Comments comment = mAdapter.getItemAtPosition(position);
            switch (id) {
                case R.id.comment_save:
                    mainViewModel.commentUpdate(new UpdateCommentReq(mainViewModel.getSelected().getId(), comment.getComment(), comment.getId()));
                    break;
                case R.id.comment_delete:
                    mainViewModel.commentDelete(comment.getId());
                    break;
            }

        }
    });

Проблема, с которой я сталкиваюсь: я запускаю приложение и перехожу к комментарию.фрагмент списка, я нажимаю кнопку add comment и перехожу ко 2-му фрагменту.Добавление комментария и возвращение.Все идет нормально.Теперь я удаляю один комментарий из списка (прекрасно работает).Я снова перехожу ко 2-му фрагменту, чтобы создать новый комментарий, и снова возвращаюсь к 1-му фрагменту.mainViewModel.getCommentDelete().observe(..) запускается снова, показывая диалог успеха (без удаления чего-либо).Проблема в том, что наблюдатель снова и снова срабатывает, как только я удаляю один комментарий из списка.

Я могу предоставить больше кода, если хотите.Любая помощь будет очень полезна.

1 Ответ

0 голосов
/ 07 июня 2019

Проблема в том, что LiveData кеширует ваше значение, и когда вы возвращаетесь на экран, вы получаете старое значение. Должен гуглить о событии SingleLiveData для целей навигации. Здесь или здесь .

...