使用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;
//}
}
答案 0 :(得分:1)
我不得不改变我的架构来重新创建片段 - 在FragmentManager中添加/删除它们,而不是在保留在内存中时附加/删除它们。
我不清楚为什么必须重新创建Fragment才能重置ViewPager。 Android FragmentManager和FragmentTransaction支持将片段保存在内存中,只需附加/分离它们,或显示/隐藏它们,因此应该可以简单地从内存片段的onCreateView事件中重置ViewPager,但同样没有上面提到的评论似乎有效。
如果其他人有解决方案,我仍然会考虑它。它将帮助我理解这个问题。