将ViewPager + FragmentStatePagerAdapter重新启动到项目0

时间:2014-07-23 18:25:14

标签: android android-viewpager android-adapter

使用SDK 19,min 13和support.v4.app Fragments。

我搜索了SO并找到了应该有用的类似线程,但我尝试的所有内容都没有解决我的问题。此外,很多人似乎都有ViewPager在他们不想要的时候重新启动的问题,而我的问题似乎恰恰相反。

这些帖子似乎对我没有帮助:
PagerAdapter start position
ViewPager PagerAdapter not updating the View
How to force ViewPager to re-instantiate its items

以下是我的设置:
内存中的(support.v4)片段,其中包含从布局文件中膨胀的ViewPager,因此不会以编程方式添加。片段本身不是重新创建的,而是在应用程序生命的记忆中;它被附加/分离到根FragmentActivity的FragmentManager。

当用户在应用程序生命周期的某个时间访问此片段时,它会被附加并调用onCreateView,我会在其中查看ViewPager并为其分配一个新的FragmentStatePagerAdapter。

这是我的问题:
用户第一次访问此寻呼机时,一切正常。下次他们访问它时,我希望它能够重新开始#34;从第0页开始,这意味着我希望不能立即向左滚动,但必须开始向右滚动。我还希望FragmentStatePagerAdapter的getItem()从位置0开始。我基本上希望它的功能与用户第一次访问它时的功能相同。但事实并非如此。

我已经尝试了几件事,但似乎总是从我离开它的页面的上一个索引处开始。因此,如果我第一次滚动5页,然后离开片段并稍后返回,则ViewPager从同一页面索引开始,这意味着我可以向左滚动5页。我不想要这个。

它可能与内部存储页面的ViewPager或FragmentStatePagerAdapter有关,这些页面尚未发布。但我认为我试过的注释掉的代码会做到这一点。可能还有另一种我没有尝试过的方法。也许这与重建我的片段无关,但在我的架构中这样做也不会很好。我希望我可以在不执行此操作的情况下重新启动ViewPager。

这是我的代码:

My Fragment&onCreateView代码。我注意到一切都没有成功。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_playscreen, container, false);

    //while (getChildFragmentManager().popBackStackImmediate()) {}

    mAdapter = new AdapterPlayPages(this, getChildFragmentManager());
    mPager = (ViewPlayPager) view.findViewById(R.id.pagerPlayScreen);
    //mPager.setAdapter(null);
    mPager.storeAdapter(mAdapter);
    //mPager.setCurrentItem(0);
    //mPager.removeAllViews();

    return view;
}

我的ViewPager,已按照这样的方式重写,以解决一个完全不相关的错误,如下所示:https://stackoverflow.com/a/19900206/1002098。这不会影响问题;我删除了这些更改,以便我可以按照建议调用setAdapter(null),但它没有解决我的问题。

public class ViewPlayPager extends ViewPager
{
    PagerAdapter mPagerAdapter;

    public ViewPlayPager(Context context)
    {
        super(context);
    }

    public ViewPlayPager(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    protected void onAttachedToWindow()
    {
        super.onAttachedToWindow();

        if (mPagerAdapter != null)
        {
            //super.setAdapter(null);  // did not help
            super.setAdapter(mPagerAdapter);
        }
    }

    @Override
    public void setAdapter(PagerAdapter adapter)
    {
        // do nothing
    }

    public void storeAdapter(PagerAdapter adapter)
    {
        mPagerAdapter = adapter;
    }
}

我的FragmentStatePagerAdapter。我删除了一些不相关的逻辑和成员。

public class AdapterPlayPages extends FragmentStatePagerAdapter
{
    private FragmentPlayScreen mParent;

    public AdapterPlayPages(FragmentPlayScreen parent, FragmentManager fragmentManager)
    {
        super(fragmentManager);

        mParent = parent;
    }

    @Override
    public int getCount()
    {
        // some logic from parent to determine true count
        // the count shouldn't effect the position to start at

        return Integer.MAX_VALUE;
    }

    @Override
    public Fragment getItem(int position)
    {
        // logic to determine type of page to display,
        // which is not changing based on position at the moment

        return new FragmentPlayPage();
    }

    // this did not seem to help me
    //@Override
    //public int getItemPosition(Object object)
    //{
    //     //return super.getItemPosition(object);
    //    return POSITION_NONE;
    //}
}

1 个答案:

答案 0 :(得分:1)

我不得不改变我的架构来重新创建片段 - 在FragmentManager中添加/删除它们,而不是在保留在内存中时附加/删除它们。

我不清楚为什么必须重新创建Fragment才能重置ViewPager。 Android FragmentManager和FragmentTransaction支持将片段保存在内存中,只需附加/分离它们,或显示/隐藏它们,因此应该可以简单地从内存片段的onCreateView事件中重置ViewPager,但同样没有上面提到的评论似乎有效。

如果其他人有解决方案,我仍然会考虑它。它将帮助我理解这个问题。