FragmentPagerAdapter的getItem不叫(FragmentPagerAdapte

2019-06-18 07:19发布

我不能够在FragmentPagerAdapter重用片段..使用destroyItem()方法,它是删除片段,但所以我用FragmentPagerAdapter相反FragmentStatePagerAdapter仍然没有所谓的getItem()again..There只是2-3图片..

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;
    }
}

而在FragmentActivity,

pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2)); 

Answer 1:

KISS答案:

简单使用FragmentStatePagerAdapter代替FragmentPagerAdapter 。

我得到了答案..首先我想删除这个问题,因为我做了非常愚蠢的错误,但这个答案会帮助谁正面临着相反的同样的问题,有人FragmentPagerAdapter ,使用FragmentStatePagerAdapter

作为@BlackHatSamurai在评论中提到:

这部作品的原因是因为FragmentStatePagerAdapter破坏为未使用的片段。 FragmentPagerAdapter没有。



Answer 2:

使用FragmentStatePagerAdapter没有完全解决我的问题这是一个类似的问题,即onCreateView没有被要求在视图寻呼机子片段。 我其实筑巢我FragmentPagerAdapter另一内部Fragment因此FragmentManager在整个所有的人共享,从而保留旧片段的实例。 此修复程序是不是喂的实例getChildFragmentManager到的构造FragmentPagerAdapter在我的主机片段。 就像是...

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());

getChildFragmentManager()方法是通过片段访问,这个工作对我来说,因为它返回一个私人FragmentManager该片断专门为这是需要嵌套的片段的情况。 我希望这可以帮助别人谁可能有同样的问题我!

  • 但是请记住使用getChildFragmentManager()您的最低API版本至少要包含17 (4.2)所以这可能会在你扔的齿轮扳手。 当然,如果你使用的片段从支持库V4,你应该没问题。


Answer 3:

我做了什么@kanika和@ Jraco11贴过,但我仍然有问题。

所以,很多的变化后,我发现一个很适合我,并加入到我的FragmentPagerAdapter接下来的代码:

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

根据我读,getItemPosition用来通知ViewPager是否要刷新的项目,并避免更新,如果在可见位置的项目并没有改变。



Answer 4:

有两种不同的情况:1)你必须为每一个寻呼机相同的布局:在这种情况下,它会更好,如果你通过PagerAdapter扩展您的自定义适配器,并返回一个布局。

2)你必须为每一个寻呼机不同的布局:在这种情况下,它会更好,如果你通过FragmentStatePagerAdapter扩展您的自定义适配器,并为每一个寻呼机返回不同fragmets。



Answer 5:

覆盖long getItemId (int position)

FragmentPagerAdapter缓存它会用碎片getItem 。 我当时甚至要求后,面临着同样的发出─ notifyDataSetChanged() getItem没有被调用。

这实际上是一个功能,而不是一个错误。 你需要重写getItemId ,这样就可以正确地重复使用您的片段。 既然你要删除的片段,你的位置在变化。 由于在文档中提到:

long getItemId (int position)

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

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

只需提供一个唯一的ID给每个片段,就大功告成了。

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



Answer 6:

方法getItem()仅用于创建新项目。 一旦创建,此方法将不会被调用。 如果你需要得到的货币通过适配器使用项目,使用此方法:

pagerAdapter.instantiateItem(viewPager, TAB_POS)


Answer 7:

我发现,设置在标签布局的监听器停止这个被称为,可能是因为他们只有空间,一个监听器tabLayout.setOnTabSelectedListener而不是侦听器的数组。



文章来源: FragmentPagerAdapter getItem is not called