未调用FragmentPagerAdapter getItem

Kan*_*ika 118 android android-fragments android-fragmentactivity

我无法在FragmentPagerAdapter中重用片段.使用destroyItem()方法,它正在删除片段,但仍然没有再次调用getItem().只有2-3个图像所以我使用FragmentPagerAdapter而不是FragmentStatePagerAdapter ..

public class ExamplePagerAdapter extends FragmentPagerAdapter {

    ArrayList < String > urls;
    int size = 0;
    public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
        super(fm);
        urls = res;
        size = urls.size();
    }

    @Override
    public int getCount() {
        if (urls == null) {
            return 0;
        } else {
            return size;
        }

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = new FloorPlanFragment();
        Bundle b = new Bundle();
        b.putInt("p", position);
        b.putString("image", urls.get(position));
        Log.i("image", "" + urls.get(position));
        fragment.setArguments(b);
        return fragment;
    }
}
Run Code Online (Sandbox Code Playgroud)

在FragmentActivity中,

pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2)); 
Run Code Online (Sandbox Code Playgroud)

Kan*_*ika 294

亲吻答案:

简单地使用FragmentStatePagerAdapter而不是FragmentPagerAdapter.

我得到了答案.首先我想删除这个问题,因为我犯了一个非常愚蠢的错误,但这个答案将帮助那些面临同样问题的人,而不是FragmentPagerAdapter使用FragmentStatePagerAdapter.

正如@BlackHatSamurai在评论中提到的:

这样做的原因是因为FragmentStatePagerAdapter破坏了未被使用的碎片.FragmentPagerAdapter才不是.

  • 这是有效的原因是因为FragmentStatePagerAdapter破坏了未被使用的碎片.FragmentPagerAdapter没有. (33认同)
  • 谢谢,你救了我. (6认同)
  • 仅供将来参考,以便在寻找他们所遇到的特定问题时找到这个; 阅读FragmentPagerAdapter和FragmentStatePagerAdapter.出于某种原因,它们的行为有所不同,您的具体用途可能需要一个而不是另一个. (3认同)
  • 讨厌成为另一个“我也是!” 帖子,但是是的&gt;.&lt;感谢您没有删除问题。 (2认同)
  • 你救了我的命. (2认同)
  • @najibputhawala 我使用了 FragmentStatePagerAdapter 但仍然面临同样的问题。未调用 getItem() (2认同)

Jra*_*o11 156

使用a FragmentStatePagerAdapter并没有完全解决我的问题,这是一个类似的问题,onCreateView在视图寻呼机中没有被调用子片段.我实际上将我的FragmentPagerAdapter内部嵌套在另一个内部,Fragment因此FragmentManager在所有这些内容中共享,从而保留了旧片段的实例.修复是将一个实例提供getChildFragmentManagerFragmentPagerAdapter我的宿主片段的构造函数.就像是...

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

getChildFragmentManager()方法可以通过片段访问,这对我有用,因为它FragmentManager为该片段返回一个私有,专门用于需要嵌套片段的情况.我希望这可以帮助那些可能遇到同样问题的人!

  • 但请记住,使用getChildFragmentManager()您的最低API版本必须至少17 (4.2),因此这可能会给您的齿轮带来麻烦.当然,如果您使用支持库v4中的片段,那么您应该没问题.

  • 这是正确的答案.问题是由于嵌套在其他片段中的片段应该使用getChildrenFragmentManager()而不是getFragmentManager(). (23认同)

ved*_*ant 7

覆盖 long getItemId (int position)

FragmentPagerAdapter缓存它使用getItem. 我面临着同样的问题 - 即使在notifyDataSetChanged() getItem没有被调用之后。

这实际上是一个功能,而不是一个错误。您需要覆盖,getItemId以便您可以正确地重用您的片段。由于您正在移除碎片,因此您的位置正在发生变化。如文档中所述:

long getItemId (int position)

返回给定位置的项目的唯一标识符。

默认实现返回给定的位置。如果项目的位置可以改变,子类应该覆盖这个方法。

只需为每个片段提供一个唯一的 id,你就完成了。

使用FragementStatePagerAdapter或返回POSITION_NONEint getItemPosition (Object object)是错误的。你不会得到任何缓存。


Jor*_*ego 5

我做了@kanika和@ Jraco11所发布的内容,但仍然有问题。

因此,经过大量更改,我发现了一个对我有用的文件,并将下一个代码添加到了FragmentPagerAdapter中:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
Run Code Online (Sandbox Code Playgroud)

根据我所读的内容,getItemPosition用于通知ViewPager是否刷新项目,并且如果可见位置的项目没有更改,则避免更新。