组件之间通信接口的替代方案



我想调用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()

有多种方法可以实现此

  1. CustomDialog dialog = new CustomDialog(fragment)一样将片段的实例发送到CustomDialog。现在CustomDialog已经引用了片段,您可以在片段中调用一个方法,该方法将从数据库中获取新数据并更新其视图

  2. 使用EventBus库。您将Fragment注册为EventBus的侦听器并实现onEventMainThread(YourEventName event)。CustomDialog将在更新数据库后向EventBus发布YourEventName事件。EventBus将此事件传递到片段,因为它已注册为侦听YourEventName

  3. 尝试刷新片段的onResume中的视图。这将在对话和片段不能同时访问的情况下起作用

最新更新