Android 未调用FragmentPagerAdapter getItem

Android 未调用FragmentPagerAdapter getItem,android,android-fragments,android-fragmentactivity,Android,Android Fragments,Android Fragmentactivity,我无法在FragmentPagerAdapter中重用碎片。。使用destroyItem()方法,它正在删除片段,但仍然没有再次调用getItem()。只有2-3个图像,因此我使用FragmentPagerAdapter而不是FragmentStatePagerAdapter public class ExamplePagerAdapter extends FragmentPagerAdapter { ArrayList < String > urls; int s

我无法在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;
    }
}
接吻回答:

简单的使用,而不是

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

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


这样做之所以有效,是因为
FragmentStatePagerAdapter
破坏 作为未被使用的片段<代码>FragmentPagerAdapter没有


有两种不同的情况: 1.)每个寻呼机的布局相同: 在这种情况下,最好扩展自定义适配器 按PagerAdapter并返回单个布局

2.)每个寻呼机都有不同的布局: 在这种情况下,最好扩展自定义适配器
通过FragmentStatePagerAdapter并为每个寻呼机返回不同的Fragmet。

使用
FragmentStatePagerAdapter
并没有完全解决我的问题,这是一个类似的问题,视图寻呼机中没有为子片段调用
onCreateView
。我实际上将我的
FragmentPagerAdapter
嵌套在另一个
片段
中,因此
FragmentManager
在所有片段中共享,因此保留了旧片段的实例。修复方法是将
getChildFragmentManager
的一个实例提供给我的主机片段中
FragmentPagerAdapter
的构造函数。类似于

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
getChildFragmentManager()
方法可以通过片段访问,这对我来说很有效,因为它为该片段返回一个私有的
FragmentManager
,特别是在需要嵌套片段的情况下。我希望这能帮助那些可能和我有同样问题的人

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

我发现在选项卡布局上设置一个监听器会阻止调用它,可能是因为在
tabLayout.setOnTabSelectedListener
上只有一个监听器的空间,而不是一个监听器数组。

我做了@kanika和@Jraco11发布的事情,但我仍然有问题

因此,在进行了大量更改后,我找到了一个适合我的,并在下一个代码中添加到我的FragmentPagerAdapter中:

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

根据我读到的内容,getItemPosition用于通知ViewPager是否刷新项目,并在可见位置的项目未更改时避免更新

覆盖
长getItemId(int位置)

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

这实际上是一个特性,而不是一个bug。您需要重写
getItemId
,以便正确地重用片段。因为你正在移除碎片,所以你的位置正在改变。如文件所述:

long getItemId(int位置)

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

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

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

int getItemPosition(Object)
中使用
FragementStatePagerAdapter
或返回
POSITION\u NONE
是错误的。您将无法获得任何缓存。

方法
getItem()
仅用于创建新项目。创建后,将不会调用此方法。如果需要获取适配器正在使用的货币项,请使用以下方法:

pagerAdapter.instantiateItem(viewPager, TAB_POS)

您是否有特别的原因推翻了
destroyItem()
?这是不必要的。若要再次初始化,请在重写它时使用FragmentStatePagerAdapter也调用super.destroyItem(容器、位置、对象);非常感谢。你的回答帮了我很大的忙。我讨厌成为另一个“我也是!”发帖,但是是的><谢谢你没有删除这个问题。之所以有效,是因为FragmentStatePagerAdapter会将未被使用的片段销毁。FragmentPagerAdapter没有。只是为了将来那些在搜索特定问题时可能会发现这一点的人提供参考;阅读FragmentPagerAdapter和FragmentStatePagerAdapter。它们的行为不同是有原因的,您的特定使用可能需要一个而不是另一个。@Najibbuthawala我使用了FragmentStatePagerAdapter,但仍然面临相同的问题。未调用getItem()。这是正确答案。问题是嵌套在其他片段中的片段应该使用getChildrenFragmentManager()而不是getFragmentManager()。非常感谢,我花了很长时间才找到这个答案!我同意石鹏的观点。这应该是正确的答案。这对我来说是个好办法。非常感谢您提交答案。文档应该在“漫游”中给出答案。在片段中加载ViewPager是非常现实的。谢谢你发布这个答案。这个答案是正确的。我必须为
getItemId
中的片段提供不同的ID,并调整
getItemPosition
以返回
POSITION\u NONE
,如果该片段应该被删除。我有一个
pagerAdapter.instantiateItem(viewPager, TAB_POS)