在 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);
}
}
我正在创建具有两个页面的 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);
}
}