在 FragmentPagerAdapter 中重新创建片段

Recreate fragments in FragmentPagerAdapter

我正在创建具有两个页面的 FragmentPagerAdapter 的应用程序。

FragmentPagerAdapter 的 class 看起来像这样

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

    public AppSectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment;
        switch (i) {
            case 0: fragment = new CurrentRateFragment(); break;
            case 1: fragment = new HistoryFragment(); break;
            default: fragment = new CurrentRateFragment(); break;
        }

        return fragment;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

我希望第一页上的某些更改(例如更改 Spinner 所选项目)导致第二页上的更改。

据我了解片段通信 (https://developer.android.com/training/basics/fragments/communicating.html) 并了解片段只能通过 Activity 进行通信。

对于这种情况,我在第一页 class 片段中创建了 public 界面

public interface CurrencyListener {
    public void onCurrencyChanged();
}

并在我的 Activity 中实现它。

现在我可以在我的第一个页面片段的 Activity 中调用 void onCurrencyChanged。

但问题是:

如何在我的 FragmentPagerAdapter 中重新创建第二个页面片段?

片段创建操作繁重。

1. 如果重新创建片段,将创建所有视图,并且需要对之前的片段进行垃圾回收。因此会有额外的内存。

因此,与其重新创建 FirstPageFragment,不如根据 currencyChanged() 方法收到的回调刷新数据。 在这种情况下,每次调用currencyChanged()方法时都会创建一次片段并更新数据。

HistoryFragment代码(要刷新的片段)

public class HistoryFragment extends Fragment implements MyActivity.IUpdateData{
    /**
     * Other method goes here
     */

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //
        if(getActivity() instanceof /**Your Activity**/){
            ((/**Your Activity**/)getActivity()).setOnUpdateListener(this);
        }
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void updateData(Object object) {
        //Refresh Data
    }
}

Activity(会刷新数据)

public class MyActivity extends Activity {
    /**
     * Other method goes here
     */
    private IUpdateData dataUpdateListener;

    public void setOnUpdateListener(IUpdateData listener){
        dataUpdateListener = listener;
    }


    public void onCurrencyChanged(){
        if(dataUpdateListener!=null){
            dataUpdateListener.updateData(/**Update Data**/);
        }
    }

        public interface IUpdateData{
            void updateData(Object o);
        }
}