【问题标题】:Recreate fragments in FragmentPagerAdapter在 FragmentPagerAdapter 中重新创建片段
【发布时间】:2017-10-29 05:18:39
【问题描述】:

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

FragmentPagerAdapter 的类如下所示

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 所选项目)导致第二页上的更改。

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

对于这种情况,我在第一页类片段中创建了公共接口

public interface CurrencyListener {
    public void onCurrencyChanged();
}

并在我的 Activity 中实现它。

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

但问题是:

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

【问题讨论】:

    标签: android android-fragments fragmentpageradapter


    【解决方案1】:

    片段创建操作繁重。

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

    因此,与其重新创建 FirstPageFragment,不如根据在您的 currencyChanged() 方法上收到的回调刷新数据。 在这种情况下,fragment 将被创建一次,并且每次调用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
        }
    }
    

    活动(将刷新数据)

    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);
            }
    }
    

    【讨论】:

    • 谢谢,但是如何从第一个片段或我的活动刷新第二个片段中的数据?你能给我代码示例或一些额外的解释吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2014-03-17
    • 2019-12-18
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多