android fragmentstatepageradapter 缓存,关于android:使用FragmentStatePagerAdapter从ViewPager动态删除项目...

关于这个话题有很多讨论

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值