碎片观察问题

时间:2019-06-07 11:24:09

标签: android lifecycle observers

我面临LiveData和Fragment Lifecycle的问题。

流程如下:

  • 第一个片段显示了评论的recyclerview。每个评论都有一个删除按钮。
  • “第一片段”具有一个菜单按钮,按下该按钮可将用户导航到“第二片段”以创建新注释。
  • 当用户创建评论时,将显示一个反馈对话框,并调用onBackPressed以关闭第二个片段。
  • 第一个片段刷新注释列表以显示更改。

看看下面的代码片段。在片段的observe上调用方法onCreateView

第一个片段:

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按钮并转到第二片段。添加评论并返回。到目前为止,一切都很好。现在,我从列表中删除一个评论(效果很好)。我再次导航至第二片段以创建新注释,然后再次返回至第一片段。 mainViewModel.getCommentDelete().observe(..)再次运行,显示成功对话框(不删除任何内容)。问题是,一旦我从列表中删除了一条评论,观察者就会一次又一次被触发。

如果您愿意,我可以提供更多代码。任何帮助都将真正有用。

1 个答案:

答案 0 :(得分:0)

问题是LiveData缓存了您的值,当您返回屏幕时,您正在获取旧值。谷歌应该关于SingleLiveData事件导航。 Herehere