我想调用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 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
我尝试过使用接口,但要么我做错了,要么它不起作用。请帮忙。接口的其他替代方案是什么?
编辑:你好像不明白我的问题。我只想从我的自定义对话框访问片段中包含的LISTADAPTER,这个网站的人。
正如我在代码中看到的,您有一个变量片段。对于您的情况,您可以定义一些BaseFragment类,在其中您将拥有抽象方法datasetChanged((。所有单独的片段都将是BaseFragment的衍生物,并且变量片段将是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时,只需将回调设置为您的碎片方法datasetChanged((:
customDialog.setCallback(fragment::datasetChanged());
之后,当您的customDialog需要通知更新时,它将调用回调函数。
notifyCallback.apply()
有多种方法可以实现此
-
像
CustomDialog dialog = new CustomDialog(fragment)
一样将片段的实例发送到CustomDialog。现在CustomDialog已经引用了片段,您可以在片段中调用一个方法,该方法将从数据库中获取新数据并更新其视图 -
使用EventBus库。您将Fragment注册为EventBus的侦听器并实现
onEventMainThread(YourEventName event)
。CustomDialog将在更新数据库后向EventBus发布YourEventName事件。EventBus将此事件传递到片段,因为它已注册为侦听YourEventName -
尝试刷新片段的onResume中的视图。这将在对话和片段不能同时访问的情况下起作用