为了账号安全,请及时绑定邮箱和手机立即绑定

刷新ViewPager Fragment中的数据

刷新ViewPager Fragment中的数据

qq_花开花谢_0 2019-07-31 10:59:40
刷新ViewPager Fragment中的数据这是我的情景:我的Activity中有ViewPager,它包含6个片段。我通过用手指轻扫禁用了分页,所以每当我想要滑动时我都使用相关按钮并且:viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);在每个刷过的片段中(刷卡完成后)我想向我的服务器发送一个GET请求并获取一些数据并在该片段中显示它。这样做:第一种方法:我在片段中使用此代码,片段一旦可见就会运行:@Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(isVisibleToUser)        {          sendGetRequest();        }}但是,这是一个问题:setUserVisibleHint正好在片段可见的情况下执行,因此滑动的动画带来了一些滞后(它不够平滑)。所以我使用了Second Approach:我在托管活动中向ViewPager 添加了OnPageChangeListener(),如下所示:viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            int CurrentPossition = 0;            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }            @Override            public void onPageSelected(int position) {                CurrentPossition = position;            }            @Override            public void onPageScrollStateChanged(int state) {                if(state == ViewPager.SCROLL_STATE_IDLE && CurrentPossition != 0){                    Toast.makeText(getBaseContext(),"finished" , Toast.LENGTH_SHORT).show();                    try{                        new fragment_two().sendGetRequest();;                    }catch(Exception ex){                        ex.printStackTrace();                    }                }            }        });它工作得很好,并且在刷卡完成后立即显示吐司,但与完全可见的片段不同,当sendGetRequest()运行时,我得到NullPointerException。
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

使用the ViewPager.OnPageChangeListener是正确的方法,但是你需要稍微重构一下你的适配器,以便保留对FragmentPagerAdapter中包含的每个Fragment的引用。

你使用instantiateItem()适配器中的方法覆盖来做到这一点,这是一个简化的例子:

 class PagerAdapter extends FragmentPagerAdapter {
        String tabTitles[] = new String[] { "One", "Two", "Three", "Four"};
        Context context;

        //This will contain your Fragment references:
        public Fragment[] fragments = new Fragment[tabTitles.length];

        public PagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }
        @Override
        public int getCount() {
            return tabTitles.length;
        }
        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();   
            case 3:
                return new FragmentFour();
            }
            return null;
        }

        //This populates your Fragment reference array:
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            fragments[position]  = createdFragment;
            return createdFragment;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return tabTitles[position];
        }         
 }

然后,使用适配器中包含的片段,而不是创建新的片段:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

  @Override
  public void onPageSelected(int position) {

        // do this instead, assuming your adapter reference
        // is named mAdapter:
        Fragment frag = mAdapter.fragments[position];
        if (frag != null && frag instanceof FragmentTwo) {
          ((FragmentTwo)frag).sendGetRequest();
        }
  }

  @Override
  public void onPageScrollStateChanged(int state) {  }});

请注意,如果在适配器中使用不同的Fragment类,则可以实现定义的接口sendGetRequest(),并在每个Fragment类中实现sendGetRequest()方法。

如果不使用接口方法,则需要将Fragment转换为您自己的Fragment类型,如上例所示,即:

if (frag instanceof FragmentTwo) {
    ((FragmentTwo)frag).sendGetRequest();}


查看完整回答
反对 回复 2019-07-31
?
翻阅古今

TA贡献1780条经验 获得超5个赞

不是在视图寻呼机侦听器中调用sendGetRequest()方法,而是在fragment_two片段类的onCreateView方法中调用GET请求。这样做的原因是您确保fragment_two中的所有视图都已通过片段的生命周期事件正确初始化。

查看完整回答
反对 回复 2019-07-31
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

正如我在第一种方法中提到的,当我在onCreateView或setUserVisibleHint中使用sendGetRequest()时,每件事都运行良好,在这种情况下的问题是转换不够顺利。这种缺乏平滑性可能是因为在请求开始时显示了ProgressDialog,但它应该显示

查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 1419 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号