显示的ViewPager第一个片段始终与FragmentStatePager错误

S.T*_*ane 8 tabs android android-viewpager fragmentstatepageradapter

我正在尝试使用与view pager + tabsPlayStore 5.1.x 相同的设计.这是我的布局:

<?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>
Run Code Online (Sandbox Code Playgroud)

我的适配器:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的标签和寻呼机显示正确!但我注意到视图寻呼机中显示的第一个片段始终与第二个片段相同.然后当我滑动一次,两次并向后滑动到第一页时,我发现现在显示了正确的片段!

我无法理解为什么会出现这种行为,请我解释一下.

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

private static int position;

public static FakeFragment newInstance(int position) {
    // TODO Auto-generated method stub
    FakeFragment.position = position;
    return new FakeFragment();
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释一下为什么吗?

我认为,通过这种方式,位置的价值将依赖于片段的生命周期,因此将始终是预期的位置,对吧?

Eug*_*nec 6

1)getItemPosition(Object)如果不处理,请不要执行.您不需要实现它,并且可能通过错误地实现它来破坏其他功能.

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

3)创建adpater类static(它提升了可重用性,适配器不应该依赖于父类来获取它的数据集,对吗?)并将Categorys作为构造函数参数传递.将其存储在变量中,并根据此数据集创建新的片段.您可能还希望将Category[position]一个参数作为参数传递给片段构造函数而不是仅仅position.