片段不断更新

时间:2013-09-02 20:47:47

标签: android android-fragments android-fragmentactivity

当我实例化三个不同的(n,n + 1,n + 2)片段时,我有一个FragmentActivity。 我需要在用户滑动时更新每个Fragment,因此我在Fragment Activity中使用了 ViewPager.SimpleOnPageChangeListener.onPageSelected ,因此当用户滑动到n + 1或n + 2 Fragment并再次滑动到n时该功能更新内容。 如果我在片段n + 1中没有使用此解决方法,则n和n + 2都已加载!我想在用户滑动时加载Fragment,而不是“预加载”。

这个解决方法对我来说很好,但它有一个问题:在应用程序启动时列表中的第一个片段不会加载其内容。要加载其内容,我必须滑动到n + 1然后返回到n。

我知道片段的内容应该在实例化片段时调用的类上设置并扩展Fragment类,但是这样我不知道如何更新每个片段,如我使用 onPageSelected

有什么建议吗?

编辑1: 我在 onCreate()

中以这种方式呈现我的片段
    for(int x = 0; x < 3; x++) {
        Bundle b = new Bundle();
        b.putString( "id" , x );
        Fragment myFrag = Fragment.instantiate( myContext , Mm_FragmentPage.class.getName() );
        myFrag.setArguments( b );
        fragments.add(myFrag);
    }

然后我在 ViewPager 中设置适配器:

    mPagerAdapter = new PagerAdapter( super.getSupportFragmentManager() , fragments );
    mPager.setAdapter( mPagerAdapter );

然后我在 TitlePageIndicator

中使用适配器
    titleIndicator = (TitlePageIndicator) findViewById( R.id.titleFragments );
    titleIndicator.setViewPager( mPager );
    titleIndicator.setOnPageChangeListener( new myPageChangeListener() );

最后,课程 PagerAdapter

public class PagerAdapter extends FragmentPagerAdapter
{
    // fragments to instantiate in the viewpager
    private List<Fragment> fragments;

    // constructor
    public PagerAdapter(FragmentManager fm, List<Fragment> fragments)
    {
        super(fm);
        this.fragments = fragments;
    }

    // return access to fragment from position, required override
    @Override
    public Fragment getItem(int position)
    {
        return this.fragments.get(position);
    }

    // number of fragments in list, required override
    @Override
    public int getCount()
    {
        return this.fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position)
    {
        return getResources().getStringArray( R.array.tab_header_name )[ position ];
    }
}

1 个答案:

答案 0 :(得分:0)

好的,首先你需要在ViewPager上设置 OnPageChangeListener 并实现方法 onPageSelected(int i)并调用适配器的 notifyDataSetChanged(),像这样:

    mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {

        }

        @Override
        public void onPageSelected(int i) {
            //Tell the adapter that the content was changed
            mPager.getAdapter().notifyDataSetChanged();

        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });

为了更新片段,您需要扩展 FragmentStatePagerAdapter ,而不是像您所做的那样扩展 FragmentPagerAdapter 。不同之处在于,使用 FragmentPagerAdapter ViewPager 将永远不会重新创建片段,而在 FragmentStatePagerAdapter 中它将会。

然后在 getItem(..)上确保通过 setArguments()将内容传递给其参数,返回带有新内容的片段的新实例。然后重写 getItemPosition(..)以告诉适配器找不到该片段,因此它必须重新创建它。

public class MyPagerAdapter extends FragmentStatePagerAdapter {
        //List to hold the fragments to be shown
        //NOTE: It's a list of Fragment classes, not a list of Fragment instances!
        private List<Class<? extends Fragment> fragments;

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            fragments.add(SomeFragment.class); 
            fragments.add(AnotherFragment.class);
            fragments.add(MoreFragment.class);
        }

        @Override
        public Fragment getItem(int i) {
            try {
                //Creates a new instance of the fragment
                Fragment instance = fragments.get(i).newInstance();
                //Put the new content by passing Bundle with new content
                instance.setArguments(args);
                return instance;
                } catch (InstantiationException e) {
                  e.printStackTrace();
                } catch (IllegalAccessException e) {
                  e.printStackTrace();
              }
            return null;
          }


        @Override
        public int getItemPosition(Object object) {
            //NOTE: you might want to put better logic here
            return POSITION_NONE;
        }

        @Override
        public int getCount() {
            return pages.size();
        }
    }

每次从一个片段滑动到另一个片段时,将调用 onPageSelected()调用notifyDataSetChanged(),这将强制适配器检查片段的位置是否已更改。由于我们在 getItemPosition(..)中返回POSITION_NONE,因此适配器认为位置已更改,然后将调用 getItem(i)。在 getItem(i)中,我们返回一个新实例(可选地,传递新参数)。问题解决了! :)

我只是自己测试了一下,创建了一个小应用程序,它有一个计数器,每当用户滑动页面时它就会增加它的效果!

这样您就可以删除 ViewPager.SimpleOnPageChangeListener.onPageSelected 。 关于ViewPager的Learn more