gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:46:27 25 4
gpt4 key购买 nike

使用 SDK 19,第 13 分钟和 support.v4.app fragment 。

我搜索过 SO 并找到了应该有帮助的类似线程,但我尝试的一切都没有解决我的问题。此外,许多人似乎遇到了 ViewPager 在他们不希望重启时重启的问题,而我的问题似乎恰恰相反。

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

这是我的设置:
内存中的一个 (support.v4) fragment ,其中包含一个 ViewPager,从布局文件中扩充,因此未以编程方式添加。 Fragment 本身不会被重新创建,而是在应用程序的整个生命周期内保存在内存中;它正在附加/分离到根 FragmentActivity 的 FragmentManager。

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

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

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

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

这是我的代码:

我的 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;
//}
}

最佳答案

我必须更改架构以重新创建 fragment - 从 FragmentManager 添加/删除它们,而不是在内存中附加/分离它们。

我不清楚为什么必须重新创建 Fragment 才能重置 ViewPager。 Android FragmentManager 和 FragmentTransaction 支持将 fragment 保存在内存中并简单地附加/分离它们,或显示/隐藏它们,因此应该可以简单地从内存中 fragment 的 onCreateView 事件中重置 ViewPager,但同样,没有任何注释掉的调用以上似乎有效。

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

关于android - 将 ViewPager + FragmentStatePagerAdapter 重新启动到项目 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com