我有一个碎片StatePageRadapter里面有6个碎片。
每个片段连接到服务器并加载数据。
现在,服务器连接是在fragment.onstart()中完成的,这意味着在任何时候,我都有3个http请求(选定的片段,每边一个)。
我想要的是当时只有一个连接,所以我想
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
@Override
public void onPageSelected(final int position)
{
CustomFragment fragment = (CustomFragment) myFragmentStatePagerAdapter.getItem(position);
fragment.onSelected();//do stuff in here
}
});
问题是,
getItem()
返回片段的新实例,尚未添加到管理器(因此,尚未创建视图等)。另外,我已经尝试过
setUserVisibleHint(boolean isVisibleToUser)
但是没有被调用visible,只有isvisibletouser=false那么,如何实现片段的“onpageselected()”事件呢?
提前谢谢
最佳答案
最好的解决方案是覆盖setUserVisibleHint()
。确保扩展FragmentPagerAdapter
。从它的source code中,您可以看到它也为可见片段调用setUserVisibleHint(true)
。我一直在用,而且效果很好。
// adapter
public static class PlayerAdapter extends FragmentStatePagerAdapter {
public PlayerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 6;
}
@Override
public Fragment getItem(int position) {
return new SimpleFragment();
}
}
// fragment
public class SimpleFragment extends Fragment {
private static final String TAG = BookControlsFragment.class.getSimpleName();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_simple, container, false);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.d(TAG, "setUserVisibleHint: " + isVisibleToUser);
}
}