关于这个话题有很多讨论
ViewPager PagerAdapter不更新视图
动态更新ViewPager?
从FragmentStatePagerAdapter删除片段
我尝试了各种解决方案(包括使用POSITION_NONE无效)
。但是我仍然不知道如何正确删除项目。
发生的是
要么我得到一张空白页(表示该片段已被破坏,但是
instantiateItem没有被要求替换)
或整个崩溃可能是因为Android管理
片段实例与我将它们保留在我的方式不匹配
arraylist/sparsearray
这是我的适配器
private class DatePickerPagerAdapter extends FragmentStatePagerAdapter {
ArrayList registeredFragments = new ArrayList();
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object){ //doesnt change much..
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return iPageCount;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.add(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, registeredFragments.get(position));
}
public void removePage(ViewGroup pager, int position) {
destroyItem(pager, position, null);
registeredFragments.remove(position);
iPageCount--;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
public void addPage() {
iPageCount++;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
}
我正在将View Pager与ViewPagerIndicator一起使用,例如,我希望能够删除其间的页面。
因此,仍然存在一个问题,在ViewPager中处理添加和删除片段的正确方法是什么?
谢谢!
如果要从ViewPager中删除项目,则以下代码没有意义:
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
本质上,您基于position创建一个Fragment。无论删除哪个页面,position的范围都会从[0,iPageCount)更改为[0,iPageCount-1),这意味着它将始终摆脱最后一个Fragment。
您所需要的大致是以下内容:
public class DatePickerPagerAdapter extends FragmentStatePagerAdapter
{
private ArrayList pageIndexes;
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
pageIndexes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
pageIndexes.add(new Integer(i));
}
}
@Override
public int getCount() {
return pageIndexes.size();
}
@Override
public Fragment getItem(int position) {
Integer index = pageIndexes.get(position);
return CreateWishFormDatePaginationFragment.newInstance(index.intValue());
}
// This is called when notifyDataSetChanged() is called
@Override
public int getItemPosition(Object object) {
// refresh all fragments when data set changed
return PagerAdapter.POSITION_NONE;
}
// Delete a page at a `position`
public void deletePage(int position)
{
// Remove the corresponding item in the data set
pageIndexes.remove(position);
// Notify the adapter that the data set is changed
notifyDataSetChanged();
}
}
请参阅此完整示例,以获取有关从FragmentStatePagerAdapter中删除项目的更多详细信息。
这仅在您尝试删除片段时才有效。 如果您尝试再次删除另一个项目,则似乎无法删除。
在为我的确切用例进行了一些修改之后,对我来说就像一个魅力。 我对此特别喜欢的是让FragmentStatePagerAdapter s FragmentManager关心每个Fragment的状态。
但是这段代码@Override public int getItemPosition(Object object){//当数据集更改时刷新所有片段,返回PagerAdapter.POSITION_NONE; }花费太多时间删除片段。 你能帮忙吗
ViewPager不会使用上面的代码删除您的片段,因为它会将多个视图(或您的情况下的片段)加载到内存中。除了可见视图之外,它还将视图加载到可见视图的任一侧。这提供了从一个视图到另一个视图的平滑滚动,这使ViewPager非常酷。
要获得所需的效果,您需要做一些事情。
将FragmentPagerAdapter更改为FragmentStatePagerAdapter。原因是FragmentPagerAdapter会将其加载的所有视图永久保存到内存中。 FragmentStatePagerAdapter处理当前视图和可遍历视图之外的视图的位置。
覆盖适配器方法getItemPosition(如下所示)。当我们调用mAdapter.notifyDataSetChanged();时ViewPager询问适配器以确定在定位方面发生了什么变化。我们使用此方法来表示一切都已更改,因此请重新处理所有视图位置。
这是代码...
private class MyPagerAdapter extends FragmentStatePagerAdapter {
//... your existing code
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
}
yaaaaa @PaulBurke