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

时间:2018-08-02 14:36:01

标签: java android

我想打电话给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

我尝试使用接口,但是我做错了或者不起作用。请帮助。接口的其他替代方法是什么?

编辑: 看来您不明白我的问题。我只想从我的自定义对话框(该站点的人员)中访问片段中包含的列表适配器即可。

2 个答案:

答案 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)

有多种方法可以实现这一目标

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

  2. 使用EventBus库。您可以将Fragment注册为EventBus的侦听器并实现onEventMainThread(YourEventName event)。CustomDialog将在更新数据库后将YourEventName事件发布到EventBus。因为注册了它来监听YourEventName

  3. ,所以EventBus会将事件传递给片段。
  4. 尝试刷新片段的onResume中的视图。如果无法同时访问对话框和片段,这将起作用