1

我有以下两种方法:

public void informAllFragmentsWhenDatabaseStatusChanged () {
    for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        if (mainActivityPageAdapter.getFragment(i) instanceof InterfaceMainDatabaseStatusChanged)
            ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getFragment(i)).onMainDatabaseStatusChanged();
    };

}

public void informAllFragmentsWhenListStatusChanged () {
    for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        if (mainActivityPageAdapter.getFragment(i) instanceof InterfaceListStatusChanged)
            ((InterfaceListStatusChanged) mainActivityPageAdapter.getFragment(i)).onListStatusChanged();
    };

}

请注意,每个都是在不同的时刻执行的。

正如您所注意到的,这两种方法的主要部分是相同的。instanceof 使用的接口名称和在对象上执行的方法有什么不同。

问题是如何以优雅的方式将这两种方法结合起来。

我在想这样的事情:

public void informAllFragments (InterfaceType interface);

有什么建议么?

4

2 回答 2

1

您可以使用 somethink 方法创建简单的界面,例如:

interface IFragment{
void getFragment(MainActivityPageAdapter mainActivityPageAdapter);
}

然后你可以创建两个类并实现这个接口。例如:

public class ListStatusChanged implemenet IFragment{
void getFragment(MainActivityPageAdapter mainActivityPageAdapter){
if (mainActivityPageAdapter.getFragment(i) instanceof  InterfaceMainDatabaseStatusChanged)
        ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getFragment(i)).onMainDatabaseStatusChanged();
}
}

二等舱也一样。所以你的主要方法看起来像

public void informAllFragments(IFragment iFragment){
   for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
      iFragment.getFragment(mainActivityPageAdapter);
   }
}

因此,当您想首先调用您的方法时,您将编写

informAllFragments(new ListStatusChanged());

更新您可以将标志放入方法 informAllFragments(boolean flag) 或 enum

所以你会有下一个

    public void informAllFragments (boolean flag) {
    for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        if (flag && mainActivityPageAdapter.getFragment(i) instanceof InterfaceMainDatabaseStatusChanged)
            ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getFragment(i)).onMainDatabaseStatusChanged();
else if (!flag && mainActivityPageAdapter.getFragment(i) instanceof InterfaceListStatusChanged)
            ((InterfaceListStatusChanged) mainActivityPageAdapter.getFragment(i)).onListStatusChanged();
    };

}

于 2013-11-06T15:07:33.610 回答
1
private void informAllFragments (){
PagerAdapter mainActivityPageAdapter = null; // assign a valid PageAdapter here

   for (int i=0; i<mainActivityPageAdapter.getCount(); i++) {
        if (InterfaceListStatusChanged.class.isAssignableFrom(mainActivityPageAdapter.getFragment(i).getClass())){
            ((InterfaceListStatusChanged) mainActivityPageAdapter.getFragment(i)).onMainDatabaseStatusChanged();
        }else if (InterfaceMainDatabaseStatusChanged.class.isAssignableFrom(mainActivityPageAdapter.getFragment(i).getClass())){
            ((InterfaceMainDatabaseStatusChanged) mainActivityPageAdapter.getFragment(i)).onListStatusChanged();
        }
    };

}

您也可以将相同的 if/else 结构与“instanceof”一起使用。当您调用不同的方法时,您的代码不能变得更短。

于 2013-11-06T14:58:09.423 回答