我想打电话给notifyDataSetChanged()
,但是我的代码结构一团糟,我无法解决。我有一个片段,一个自定义对话框类和MainActivity。
MainActivity.java
Fragment is created here along with 3 other fragments. Dialog is also created here
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
fragment = new FragmentHome();
loadFragment(fragment);
loadCustomActionBar("Home", false);
return true;
case R.id.navigation_foods:
fragment = new FragmentFood();
loadFragment(fragment);
loadCustomActionBar("Foods", true);
return true;
case R.id.navigation_drinks:
fragment = new FragmentDrink();
loadFragment(fragment);
loadCustomActionBar("Beverages", true);
return true;
case R.id.navigation_cart:
fragment = new FragmentCart();
loadFragment(fragment);
loadCustomActionBar("Cart", false);
return true;
}
return false;
}
};
private void loadCustomActionBar(String titleTxt, boolean bool) {
CustomDialog dialog = new CustomDialog()
.....
}
CustomDialog
CustomDialog is responsible for updating database.
I want to call notifyDataSetChanged() here after updating database to update view as well.
Button addItem = .....
addItem.setOnClickListener(new OnClickListener() {
public void onClick() {
dialog.show();
}
});
Fragment.java
ListAdapter is located here
我尝试使用接口,但是我做错了或者不起作用。请帮助。接口的其他替代方法是什么?
编辑: 看来您不明白我的问题。我只想从我的自定义对话框(该站点的人员)中访问片段中包含的列表适配器即可。
答案 0 :(得分:0)
正如我在您的代码中看到的那样,您有一个变量 fragment 。对于您的情况,您可以定义一些BaseFragment类,在其中将具有抽象方法datasetChanged()。您所有单独的片段都将是BaseFragment的派生类,变量 fragment 的类型将是BaseFragment。派生片段将实现函数datasetChanged(),在其中它们将为自己的适配器调用notifyDatasetChanged。
然后,您可以在CustomDialog中有一个回调,该回调将调用变量片段的datasetChanged。
class BaseFragment extends Fragment {
...
abstract void datasetChanged();
...
}
class CustomDialog extends Dialog {
...
var notifyCallback: Function;
public setCallback(Function callback) {
notifyCallback = callback;
}
}
然后,当您创建CustomDialog时,只需将片段方法的数据集Changed()设置为回调:
customDialog.setCallback(fragment::datasetChanged());
之后,当您的customDialog需要通知更新时,它将调用回调函数。
notifyCallback.apply()
答案 1 :(得分:0)
有多种方法可以实现这一目标
将片段的实例像CustomDialog dialog = new CustomDialog(fragment)
一样发送到CustomDialog。现在,CustomDialog拥有对该片段的引用,您可以在该片段中调用一个方法,该方法将从db中获取新数据并更新其视图
使用EventBus库。您可以将Fragment注册为EventBus的侦听器并实现onEventMainThread(YourEventName event)
。CustomDialog将在更新数据库后将YourEventName事件发布到EventBus。因为注册了它来监听YourEventName
尝试刷新片段的onResume中的视图。如果无法同时访问对话框和片段,这将起作用