使用 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-B
s 单例中数据实例。
没有事件总线解决方案.. :)
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){
}
}
我正在使用 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-B
s 单例中数据实例。
没有事件总线解决方案.. :)
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){
}
}