在FragmentPagerAdapter中重新创建片段
问题描述:
我正在创建具有两个页面的FragmentPagerAdapter的应用程序。在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;
}
}
我想要的第一页上的一些变化(例如变化微调所选项目)造成的第二页上的变化。
正如我已阅读关于片段通信(https://developer.android.com/training/basics/fragments/communicating.html)并了解片段只能通过活动进行通信。
对于这种情况我已经创建公共接口,我的第一个页面类片段
public interface CurrencyListener {
public void onCurrencyChanged();
}
而且在我的活动实现它。
现在我可以从我的第一页片段的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
}
}
活动(这将刷新数据)
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);
}
}
谢谢,但如何从第一片段刷新第二片段的数据或从我的活动?你可以给我代码示例或一些额外的解释吗? –
请参考代码 –