片段观察问题
fragment observe issue
我遇到了 LiveData 和片段生命周期的问题。
流程是这样的:
- 第一个片段显示评论的回收视图。每条评论都有一个删除按钮。
- 第一个片段有一个菜单按钮,按下该按钮后,用户将导航到第二个片段以创建新评论。
- 当用户创建评论时,会显示一个反馈对话框并调用
onBackPressed
关闭第二个片段。
- 第一个片段刷新评论列表以显示更改。
看看下面的代码片段。正在片段的 onCreateView
.
上调用方法 observe
第一个片段:
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(..)
运行 再次出现,显示成功对话框(不删除任何内容)。问题是一旦我从列表中删除一条评论,观察者就会一次又一次地被触发。
如果您愿意,我可以提供更多代码。任何帮助都会很有帮助。
我遇到了 LiveData 和片段生命周期的问题。
流程是这样的:
- 第一个片段显示评论的回收视图。每条评论都有一个删除按钮。
- 第一个片段有一个菜单按钮,按下该按钮后,用户将导航到第二个片段以创建新评论。
- 当用户创建评论时,会显示一个反馈对话框并调用
onBackPressed
关闭第二个片段。 - 第一个片段刷新评论列表以显示更改。
看看下面的代码片段。正在片段的 onCreateView
.
observe
第一个片段:
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(..)
运行 再次出现,显示成功对话框(不删除任何内容)。问题是一旦我从列表中删除一条评论,观察者就会一次又一次地被触发。
如果您愿意,我可以提供更多代码。任何帮助都会很有帮助。