gpt4 book ai didi

android - 动态更改 ViewPager 的下一页

转载 作者:行者123 更新时间:2023-11-30 00:21:29 24 4
gpt4 key购买 nike

我正在使用 ViewPager 并在其中显示许多不同的 Fragments,不仅在内容上,而且它们也使用不同的类。要显示的列表应该动态更改,即使我设法交换项目并将新项目添加到适配器(并调用 notifyDataSetChanged),如果我尝试更改下一个项目,它仍会滑动到它在使用 mPager.setCurrentItem(mPager.getCurrentItem() + 1);

我只是在当前项目和当前下一个项目之间添加一个新的 Fragment,它在适配器中正确显示,但由于下一个项目已经预加载,所以 getItem 在适配器中甚至没有被调用。

有没有比 notifyDataSetChanged 更“强大”的方法告诉我的 ViewPager 它应该再次获取下一个项目?


代码示例:

我的 FragmentPagerAdapter 中的添加和获取项目方法(仅示例,不是实际代码)

public void add(@NonNull Integer fragmentIndex) {
mFragmentOrder.add(fragmentIndex);
notifyDataSetChanged();
}

@Override
public Fragment getItem(int position) {
int selectedFragment = mFragmentOrder(position);
Fragment fragment;

switch (selectedFragment) {
case 1:
fragment = new FragmentA();
break;
case 2:
fragment = new FragmentB();
break;
case 3:
fragment = new FragmentC();
break;
default:
fragment = new FragmentD();
break;
}

return fragment;
}

这是用于转到下一个项目的功能(我不允许滑动)

public void goToNext() {
mPager.setCurrentItem(mPager.getCurrentItem() + 1);
}

编辑:

编辑 1:我已经尝试使用 FragmentStatePagerAdapter 并将 OffscreenPageLimit 设置为 0,但无济于事。

编辑 2:[解决方案] 使用 FragmentStatePagerAdapter 并覆盖 getItemPosition 函数以返回 POSITION_NONE 或在适当情况下的索引解决了问题。出于某种原因,即使在实现了此函数的正确版本后,正常的 FragmentPagerAdapter 仍会传送错误的 Fragment

最佳答案

默认情况下,FragmentPagerAdapter 假定其项目的数量和位置保持固定。因此,如果要引入动态性,则必须通过在继承的适配器类中实现 getItemPosition(Object object) 方法自行提供。一个非常基本(但效率低下)的实现是这样的:

@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}

每次父 View 确定其 subview (项目)之一的位置是否已更改时,此代码将强制重新创建 fragment 。如果你想避免在不必要的时候重新创建,你必须在方法中包含一些逻辑。像这样:

@Override
public int getItemPosition (Object object) {
if (fragmentOrder.indexOf(object) == -1) {
return POSITION_NONE;
} else {
return index;
}
}

最后,通过向您的 fragment 添加一个 onDestroyView 方法并使您正在使用的 View 无效来注意可能的内存泄漏。

Here用两个 PagerAdapter 很好地讨论了这些问题。

关于android - 动态更改 ViewPager 的下一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46203286/

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