首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FragmentStatePagerAdapter onPageSelected事件

FragmentStatePagerAdapter onPageSelected事件
EN

Stack Overflow用户
提问于 2014-05-25 16:05:21
回答 4查看 8.7K关注 0票数 6

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

每个片段连接到服务器并加载数据。

现在,服务器连接是用Fragment.onStart()完成的,这意味着在任何时候,我都有3个http请求正在进行(所选的片段,每端一个)。

我希望当时只有一个连接,所以我想要使用

代码语言:javascript
复制
 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),但是没有调用可见的,只调用isVisibleToUser = false

那么,如何实现片段的"onPageSelected()“事件呢?

提前感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:44:54

对您来说最好的解决方案是重写setUserVisibleHint()。确保您扩展了FragmentPagerAdapter。从它的source code中可以看到,它也调用了setUserVisibleHint(true)作为可见片段。我一直都在用它,而且效果很好。

代码语言:javascript
复制
// 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);
    }
}
票数 8
EN

Stack Overflow用户

发布于 2014-05-28 02:28:20

对我起作用的是,在寻呼机适配器的getItem方法中,将我自己返回的自定义片段的引用保存在列表中。片段寻呼适配器和片段状态寻呼适配器似乎都遵循这样的约定,这意味着getItem(i)返回的最后一个片段将是在onPageSelected(i)方法中刷新的正确片段。

我只使用片段寻呼机适配器和数量相当少的选项卡测试了这种技术。对于状态寻呼机适配器,需要进行一些测试,以确定对片段的引用是否会导致内存使用量的增加。

票数 1
EN

Stack Overflow用户

发布于 2018-03-16 23:26:27

上火车晚了,.Personally,我最喜欢的不是这种方法。他们很讨厌。最好的方法是使用适配器setPrimaryItem(ViewGroup container, int position, Object object)

内部setPrimaryItem' save the current Fragment and use it insideonPageSelected(最后一个int位置)

代码样本是这样的,

代码语言:javascript
复制
  @Override
  public void setPrimaryItem(ViewGroup container, int position, Object object) {
    super.setPrimaryItem(container, position, object);
    currentFragment = (ProductListFragment) object;
   }

  // Inside view pager listener use the currently visible fragment
  viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
   { 
       @Override
       public void onPageSelected(final int position)
      {
         currentFragment.onSelected(); // do your thing man
      }
  });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23857299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档