FragmentStatePagerAdapter onPageSelected事件

Che*_*rra 6 android android-fragments android-viewpager

我有一个FragmentStatePagerAdapter,里面有6个片段.

每个Fragment连接到服务器并加载数据.

现在,服务器连接正在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
    }
 });
Run Code Online (Sandbox Code Playgroud)

问题是,getItem()返回片段的新实例,尚未添加到管理器(因此,尚未创建视图等).

此外,我已经尝试setUserVisibleHint(boolean isVisibleToUser)但是没有被调用可见,只有isVisibleToUser = false

那么,如何为Fragment实现"onPageSelected()"事件呢?

提前致谢

ser*_*nka 9

最适合您的解决方案是覆盖setUserVisibleHint().确保你延长FragmentPagerAdapter.从它的源代码中你可以看到它也需要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);
    }
}
Run Code Online (Sandbox Code Playgroud)