我有以下情况:
我有一个托管ViewPager的Activity,我有4个片段;
一开始的ViewPager包含片段A,
当用户在ViewPager上滑动片段B进入ViewPager,然后片段C和片段D …等…
现在,只要实例化FragmentPagerAdapter,就会创建至少2个片段.
这带来了两个问题:
>每个片段都需要执行网络呼叫,但我不想做不必要的(我不想为片段B进行网络调用,如果用户从不滑动到片段B);
>类似于1.),当Fragment执行网络调用时,我需要显示一个ProgessDialog,但是如果用户从未进入过它,我不想显示Fragment B中的对话框…
请问在这种情况下我应该使用什么样的模式?
活动
public class PagerActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.viewpager_layout); ViewPager pager=(ViewPager)findViewById(R.id.pager); TabPageIndicator tabs=(TabPageIndicator)findViewById(R.id.titles); pager.setAdapter(buildAdapter()); tabs.setViewPager(pager); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } }
FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentPagerAdapter { @Override public int getCount() { return (4); } @Override public Fragment getItem(int position) { if (position == 1) { if (dashbardFragment == null) dashbardFragment = DashBoardFragment.newInstance(position); return dashbardFragment; } if (position == 0) { if (listOfParticipantFragment == null) listOfParticipantFragment = ListOfParicipantsFragment .newInstance(position); return listOfParticipantFragment; } }
1片段
public class ListOfParicipantsFragment extends Fragment { public static ListOfParicipantsFragment newInstance(int position) { ListOfParicipantsFragment frag = new ListOfParicipantsFragment(); return (frag); } public static String getTitle(Context ctxt,int position) { return myApplication.getContext().getResources().getString(R.string.list_of_participants_fragment_title); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { View result = inflater.inflate(R.layout.guest_list_fragment_layout,container,false); return (result); }
解决方法
试试这个,在每个片段覆盖下面的方法,并在它可见时调用你的函数:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisible()){ if(isVisibleToUser){ Log.d("MyTag","My Fragment is visible"); }else{ Log.d("MyTag","My Fragment is not visible"); } } }
编辑
注意:这仅在使用FragmentPagerAdapter或FragmentStatePagerAdapter时有用