android 未调用片段页面适配器getItem

mitkmikd  于 2022-12-25  发布在  Android
关注(0)|答案(7)|浏览(147)

我无法在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;
    }
}

在碎片活动中,

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

qltillow1#

KISS回答:
简单地使用FragmentStatePagerAdapter代替FragmentPagerAdapter
我得到了答案。首先,我想删除这个问题,因为我正在做一个非常愚蠢的错误,但这个答案将帮助人们谁是面临同样的问题,而不是FragmentPagerAdapter,使用FragmentStatePagerAdapter
正如@BlackHatSamurai在评论中提到的:
这样做的原因是因为FragmentStatePagerAdapter作为未使用的碎片销毁。FragmentPagerAdapter不这样做。

snvhrwxg

snvhrwxg2#

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

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());

getChildFragmentManager()方法可以通过一个片段访问,这对我很有效,因为它为该片段返回一个私有的FragmentManager,专门用于需要嵌套片段的情况。

  • 但是要记住,要使用getChildFragmentManager(),你的最低API版本必须至少是17 (4.2),所以这可能会给你的齿轮带来麻烦。当然,如果你使用的是支持库v4的片段,你应该没问题。
dsekswqp

dsekswqp3#

覆盖long getItemId (int position)

FragmentPagerAdapter缓存它使用getItem创建的片段。我也面临着同样的问题-即使在调用notifyDataSetChanged()之后,getItem也没有被调用。
这实际上是一个特性,而不是bug。你需要重写getItemId,这样你才能正确地重用你的片段。因为你正在删除片段,你的位置也在改变。正如文档中提到的:
long getItemId (int position)
返回给定位置项的唯一标识符。
默认实现返回给定的位置。如果项的位置可以更改,则子类应该重写此方法。
只需为每个片段提供一个唯一的id,就可以完成了。
使用FragementStatePagerAdapter或在int getItemPosition (Object object)中返回POSITION_NONE是错误的。您将不会获得任何缓存。

4dbbbstv

4dbbbstv4#

我做了@kanika和@Jraco11发布的事情,但我仍然有问题。
所以,经过大量的更改,我找到了一个适合我的,并添加到我的FragmentPagerAdapter下一个代码:

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

据我所知,getItemPosition用于通知ViewPager是否刷新条目,如果可见位置的条目没有变化,则避免更新。

t0ybt7op

t0ybt7op5#

方法getItem()只用于新建项目,项目一旦创建,就不会调用此方法,如果需要获取适配器当前正在使用的项目,请使用此方法:

pagerAdapter.instantiateItem(viewPager, TAB_POS)
anauzrmj

anauzrmj6#

有两种不同的方案:1.)每个寻呼机的布局都相同:在这种情况下,最好通过PagerAdapter扩展自定义适配器并返回单个布局。
2.)每个页面都有不同的布局:在这种情况下,最好通过FragmentStatePagerAdapter扩展自定义适配器,并为每个分页器返回不同的片段。

qlzsbp2j

qlzsbp2j7#

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

相关问题