我有一个活动,其上有3个片段,其中一个名为“TaskFragment”。
在我的主要活动中,我只加载片段。 在TaskFragment中,我有一个工作正常的RecyclerView,并按预期显示这些项目。
问题来了,当我使用DialogFragment插入数据时,因为它确实插入数据(我正在使用DbFlow ORM),但它(当然)不刷新适配器,因为它位于DetailMainActivity活动内的TaskFragment片段中正如我所说。
我尝试使用onResume()和onPause()来刷新适配器,但是从不调用它们,因为活动没有被暂停,或者在forogume中没有调用DialogFragment。
我已经尝试过使用一个界面,但它不起作用,我搜遍了所有的stackoverflow和谷歌没有运气。
我在这里留下一些代码供您更好地理解:
DetailMainActivity.java 在onClick界面中,我向用户显示DialogFragment以输入信息。
FragmentManager fm = getSupportFragmentManager();
AddSimpleTask sptask = new AddSimpleTask();
sptask.show(fm, "tag");
TaskFragment.java 在这个片段中,我有我的RecyclerView
private void setupRecyclerView() {
mRecyclerView.setAdapter(adapter);
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
mRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (DetailMainActivity.FAB_Status) {
DetailMainActivity.hideFAB();
DetailMainActivity.FAB_Status = false;
}
return false;
}
});
}
private void setupAdapter() {
adapter = new DetailMainTaskAdapter(simpleTaskList, this);
}
AddSimpleTask 这是我的DialogFragment。我已经设置了一个setOnShowListener(),以避免DialogFragment提前解除。
@Override
public void onShow(DialogInterface dialogInterface) {
final AlertDialog dialog =(AlertDialog) getDialog();
if (dialog != null){
Button positiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE);
Button negativeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mEditTextName.getText().toString().trim().isEmpty() ||
mEditTextContent.getText().toString().trim().isEmpty() ) {
if (mEditTextName.getText().toString().trim().isEmpty()) {
mEditTextName.setError("Can not be empty");
}
if (mEditTextContent.getText().toString().trim().isEmpty()) {
mEditTextContent.setError("Can not be empty");
}
}else {
presenter.beingInsertion(mEditTextName.getText().toString().trim(), mEditTextContent.getText().toString().trim()
, foreignId);
}
}
});
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
如果成功实现了插入,则调用onInsertSuccess方法(我正在使用MVP)
@Override
public void onInsertSuccess() {
Snackbar.make(getActivity().findViewById(R.id.containerMainDetail), "Actividad agregada", Snackbar.LENGTH_SHORT).show();
dismiss();
}
我在很多地方调用过adapter.notifyDataSetChanged(),我也尝试过使用自定义界面,但是我无法使其工作。
很抱歉这篇长篇文章,但请提前感谢您的帮助。
答案 0 :(得分:0)
你的陈述中有一些错误,但我稍后会谈到。 notifyDataSetChanged()
仅通知适配器基础列表(或数组)已更改。这意味着您首先需要在调用适配器上的notifyDataSetChanged()
之前重新查询数据库并获取新列表,否则没有任何意义,因为基础列表仍然是相同的并且它不会更新适配器。
调用此方法的正确方法是通过自定义侦听器接口而不是onPause()/onResume()
回调,因为用户可能没有输入值,因此您将不必要地查询数据库。在自定义侦听器接口实现中,首先使用数据库中的新数据更新列表,然后通知适配器。
假设当您的Activity被DialogFragment覆盖时,onPause()/onResume()
回调不会发生,这会导致错误 - 这是不正确的。活动视图部分覆盖的那一刻,将触发onPause()
回调。