使用 TabLayout 的同一片段的不同实例之间的通信

Communication between different instances of same fragment with TabLayout

我正在使用 TabLayout 和 ViewPager 在我的应用程序中显示标签。我只有两个标签。这两个选项卡使用相同的片段(不同的实例),我在每个片段中都有一个回收器。每个回收商显示的数据不同。

在我的 FragmentPagerAdapter 中,我这样做:

 @Override
    public Fragment getItem(int position) {
        Bundle bundle = new Bundle();
        if (position == 0) {
            bundle.putString(TreinamentosFragment.EXTRA_TIPO, TreinamentosFragment.TIPO_PENDENTE);
        } else {
            bundle.putString(TreinamentosFragment.EXTRA_TIPO, TreinamentosFragment.TIPO_CONCLUIDO);
        }

        Fragment fragment = new TreinamentosFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

通过这种方法,我能够在运行时知道每个片段是什么类型 并在网络服务中获取正确的信息以显示。

但是,问题是,当用户在片段 A 中并以某种方式与其中一个回收器项目交互时,我从适配器中删除了这个项目,我需要将这个项目放入片段 B 的适配器中。我怎样才能做到这一点?如何恢复片段 B 的特定实例并更改其适配器?

我想在不使用任何类型的事件总线的情况下执行此操作。

我的片段 A 和 B 已经在另一个片段中,因为我也在使用导航抽屉。

您需要使用单例数据类。

https://en.wikipedia.org/wiki/Singleton_pattern

你有 2 个适配器,那么你需要两个单例数据 类.. 当你从 Fragment-A 中删除项目时,然后将删除的项目添加到 Frag-Bs Singleton Data instance. As Fragment-B resume/visible the just reload data from Frag-Bs 单例中数据实例。

没有事件总线解决方案.. :)

public class SingletonDemo {
    private static volatile SingletonDemo instance = null;
    private SingletonDemo() { }

    public static synchronized SingletonDemo getInstance() {
        if (instance == null) {
            instance = new SingletonDemo();
        }

        return instance;
    }
}
class TreinamentosFragment extends Fragment{


   public onItemClick(Item item){

      List fragments =  getParentFragment().getChildFragmentManager().getFragments();
      for(Fragment fragment : fragments ){
          if(fragment  instanceof TreinamentosFragment  &&TreinamentosFragment.TIPO_CONCLUIDO .equalIgnoreCase(fragment.getArgments().getString(TreinamentosFragment.EXTRA_TIPO))){
            (TreinamentosFragment )fragment.addItem(item);
         }
      }
      //or
      List fragmentA =  getParentFragment().getChildFragmentManager().FindFragmentByTag("android:switcher:" + R.id.viewpager + ":1");
      if(fragmentA instanceof TreinamentosFragment){
         (TreinamentosFragment )fragmentA.addItem(item);
      }

   }

   public addItem(Item item){

   }
}