当前位置: 首页 > 知识库问答 >
问题:

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

宰父单弓
2023-03-14

我试图拥有与PlayStore 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>

我的适配器:

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

我的标签和传呼机显示正确!但是我注意到,在视图分页中显示的第一个片段总是与第二个相同。然后当我刷一次,两次,刷回第一页时,我发现现在显示的是正确的片段!!

private static int position;

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

有人能解释一下为什么吗??

我认为,这样,位置的价值将直接取决于片段的生命周期,所以总是预期的位置,对吗??

共有1个答案

吴浩皛
2023-03-14

1)如果不处理getitemposition(Object),请不要实现它。您不需要实现它,如果实现错误,您可能会破坏其他一些功能。

2)getitem(int)的要点是返回一个新的片段。

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

 类似资料:
  • 我找到的唯一解决办法就是打电话给 在显示父片段之后。这会以某种方式触发视图被重新创建并出现在屏幕上。不幸的是,这有时会导致在旧的观察器上处理两次调用的寻呼机适配器时出现异常。 有没有更好的办法做到这一点?我想我要问的是:

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。我使用方法检测何时出现在屏幕上。当用户在选项卡之间滑动时,这非常有效,但它在第一次加载时不起作用。要运行该方法中的代码,我必须向左滑动,然后返回到第一个,因为方法是在方法之前调用的。 你有任何想法,我如何运行这段代码后,第一个片段是可见的吗?中有方法吗?

  • 所以我用FragmentStatePagerAdapter实现了一个ViewPager,我有两个片段。我用参数1和2调用了setOffscreenPageLimit(),希望片段不会被重新创建,但是第一个片段总是被重新创建,而第二个片段被创建。 第一个片段总是经过这些步骤,只要它离开视野(向右滑动到另一个片段,或者点击主页按钮,等等...) on暂停 onStop onAttach 创建 onCr

  • 当我在viewPager中从其相邻片段(0,2)中滑动到或选择Fragment1(片段编号为0-3)时,它的onCreateView或onCreate函数未被调用。 但是当我从Fragment3回扫或者选择Fragment1(当Fragment3是活动的)时,这两个函数都被调用了。我很困惑为什么不从相邻的片段中调用它。 这是未正确调用onCreateView的片段的代码 //Toast.MakeT

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?

  • 我有一个事件序列,通过它,我已经将三个片段一个接一个地添加到背景堆栈中。这些片段,每一个都覆盖了活动的全屏。 我已经存储了从Frag1的提交返回。 现在在Frag3中,基于特定的单击,我想直接回到Frag1并丢弃/弹出之间的所有Fragments。 因此,单击此按钮时,我会向活动发送一条消息,该消息执行以下操作: 但我只是得到一个空白屏幕,所以我假设没有加载碎片。 我甚至试过:在commit-