显示的ViewPager第一个片段总是与FragmentStatePager错误

我正在尝试与PlayStore 5.1.x具有相同的view pager + tabsdevise。 这是我的布局:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical|center_horizontal" android:gravity="center_vertical|center_horizontal" android:orientation="vertical"> <com.astuetz.PagerSlidingTabStrip android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/background_tabs" /> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

我的适配器:

 public class MainPagerAdapter extends FragmentStatePagerAdapter { private ArrayList<FakeFragment> fragments; public MainPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub fragments = new ArrayList<FakeFragment>(); } @Override public Fragment getItem(int position) { // TODO Auto-generated method stub if(position < getCount()) { FakeFragment fragment = FakeFragment.newInstance(position); fragments.add(fragment); } return fragments.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return Category.values().length; } @Override public CharSequence getPageTitle(int position) { // TODO Auto-generated method stub return Category.values()[position].getTitle(); } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return POSITION_NONE; } } 

我的标签和传呼机显示正确! 但我已经注意到,查看传呼机中显示的第一个片段总是与第二个片段相同。 然后,当我滑动一次,两次,并滑回到第一页,我发现正确的片段现在显示!

我不明白为什么这个行为,请我解释一下。

这个问题是由于我的FakeFragment.newInstance()方法的定义。

 private static int position; public static FakeFragment newInstance(int position) { // TODO Auto-generated method stub FakeFragment.position = position; return new FakeFragment(); } 

我改变了它通过使用setArguments(args)到我的FakeFragment实例,然后在onCreate方法中检索它。 现在一切工作都很好!

有人可以解释我为什么?

我认为,这样一来,仓位的价值就会依靠碎片的生命周期,所以总会是预期的位置,对吗?

Solutions Collecting From Web of "显示的ViewPager第一个片段总是与FragmentStatePager错误"

1)如果你不处理它,不要实现getItemPosition(Object) 。 你不需要实现它,你可能会通过错误的实现来破坏一些其他的function。

2) getItem(int) )的要点是返回一个新的片段。 抛弃片段数组,因为它没有任何意义。

3)使adpater类成为static (它促进了可重用性,适配器不应该依赖于父类来获取它的数据集,对吗?)并传递Category作为构造函数参数。 将其存储在一个variables中,并根据此数据集创build新的片段。 你也可能想要传递一个Category[position]作为参数给fragment构造函数,而不仅仅是position

getItem()实现是问题。

 @Override public Fragment getItem(final int position) { return FakeFragment.newInstance(position); } 

你不应该改变这个get方法中的数据:不要在其中调用add() 。 我怀疑Adapter在这一点上会知道你添加了一个元素。