显示ViewPager第一个片段总是错FragmentStatePager [英] ViewPager first fragment shown is always wrong with FragmentStatePager

查看:241
本文介绍了显示ViewPager第一个片段总是错FragmentStatePager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想有相同的查看传呼机+标签页设计为Play商店中5.1.x.
这是我的布局:

I am trying to have the same view pager + tabs design as the PlayStore 5.1.x. Here is my layout :

<?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;
    }
}

我的选项卡和寻呼机都显示正常!但我注意到,在视图寻呼机显示的第一个片段始终是一样的第二个。然后,当我刷卡一次,两次,轻扫回到第一页,我发现了正确的片段现在显示!

My tabs and pager are showing correctly ! but i have noticed that the first fragment shown in the view pager is always the same as the second one. Then when I swipe once, twice and swipe back to the first page, I find that the correct fragment is now shown !!

我不明白为什么这种行为,请我需要一些解释。

I can't understand why this behaviour, please I need some explanations.

SOLUTION

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

The issue was due to my FakeFragment.newInstance() method definition.

private static int position;

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

我通过改了一个 setArguments(参数)我的 FakeFragment 实例,然后检索它在的onCreate 方法。现在,所有的工作太好了!

I changed it by using a setArguments(args) to my FakeFragment instance, and then retrieve it in onCreate method. Now all is working nice !

有人能解释我为什么?

我认为,通过这种方式,位置值将entierly取决于片段的生命周期,所以将永远的预期位置,右?

I think that, in this way, value of position will entierly depend on fragment's lifecycle, so will be always the expected position, Right ??

推荐答案

1)不执行 getItemPosition(对象),如果你不处理它。你不需要实现它,你可能会被实施错打破一些其他的功能。

1) Do not implement getItemPosition(Object) if you don't handle it. You're not required to implement it and you might break some other functionality by implementing it wrong.

2)的getItem的点(INT)是返回一个新片段。沟片段数组作为它没有任何意义。

2) The point of getItem(int) is to return a new fragment. Ditch the fragment array as it makes no sense.

3)使adpater类静态(它促进了可重用性,适配器不应该依赖于父类,以获取其数据集,对吧?),并通过了类别 S作为构造函数的参数。它存储在一个变量,并根据这组数据作出新的片段。你也可能会想传递一个分类[位置] 作为参数的构造函数的片段,而不是仅仅位置

3) Make the adpater class static (It promotes reusability, the adapter should not depend on the parent class to get its data set, right?) and pass the Categorys as a constructor parameter. Store it in a variable and make new fragments according to this data set. You'll also probably want to pass a Category[position] as a parameter to the fragment constructor instead of just position.

这篇关于显示ViewPager第一个片段总是错FragmentStatePager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆