刷新ViewPager Fragment中的数据

刷新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。

qq_花开花谢_0
浏览 1420回答 3
3回答

慕田峪9158850

使用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();}

翻阅古今

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

梵蒂冈之花

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

相关分类

Java
Android