当我实例化三个不同的(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 ];
}
}
答案 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。