我无法在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));
7条答案
按热度按时间qltillow1#
KISS回答:
简单地使用FragmentStatePagerAdapter代替FragmentPagerAdapter。
我得到了答案。首先,我想删除这个问题,因为我正在做一个非常愚蠢的错误,但这个答案将帮助人们谁是面临同样的问题,而不是
FragmentPagerAdapter
,使用FragmentStatePagerAdapter
。正如@BlackHatSamurai在评论中提到的:
这样做的原因是因为
FragmentStatePagerAdapter
作为未使用的碎片销毁。FragmentPagerAdapter
不这样做。snvhrwxg2#
使用
FragmentStatePagerAdapter
并没有完全解决我的问题,这是一个类似的问题,在视图分页器中没有为子片段调用onCreateView
。我实际上是将我的FragmentPagerAdapter
嵌套在另一个Fragment
中因此FragmentManager
在所有这些片段中共享,从而保留旧片段的示例。修复的方法是将getChildFragmentManager
的一个示例提供给宿主片段中FragmentPagerAdapter
的构造函数。getChildFragmentManager()
方法可以通过一个片段访问,这对我很有效,因为它为该片段返回一个私有的FragmentManager
,专门用于需要嵌套片段的情况。getChildFragmentManager()
,你的最低API版本必须至少是17 (4.2)
,所以这可能会给你的齿轮带来麻烦。当然,如果你使用的是支持库v4的片段,你应该没问题。dsekswqp3#
覆盖
long getItemId (int position)
FragmentPagerAdapter
缓存它使用getItem
创建的片段。我也面临着同样的问题-即使在调用notifyDataSetChanged()
之后,getItem
也没有被调用。这实际上是一个特性,而不是bug。你需要重写
getItemId
,这样你才能正确地重用你的片段。因为你正在删除片段,你的位置也在改变。正如文档中提到的:long getItemId (int position)
返回给定位置项的唯一标识符。
默认实现返回给定的位置。如果项的位置可以更改,则子类应该重写此方法。
只需为每个片段提供一个唯一的id,就可以完成了。
使用
FragementStatePagerAdapter
或在int getItemPosition (Object object)
中返回POSITION_NONE
是错误的。您将不会获得任何缓存。4dbbbstv4#
我做了@kanika和@Jraco11发布的事情,但我仍然有问题。
所以,经过大量的更改,我找到了一个适合我的,并添加到我的FragmentPagerAdapter下一个代码:
据我所知,getItemPosition用于通知ViewPager是否刷新条目,如果可见位置的条目没有变化,则避免更新。
t0ybt7op5#
方法
getItem()
只用于新建项目,项目一旦创建,就不会调用此方法,如果需要获取适配器当前正在使用的项目,请使用此方法:anauzrmj6#
有两种不同的方案:1.)每个寻呼机的布局都相同:在这种情况下,最好通过PagerAdapter扩展自定义适配器并返回单个布局。
2.)每个页面都有不同的布局:在这种情况下,最好通过FragmentStatePagerAdapter扩展自定义适配器,并为每个分页器返回不同的片段。
qlzsbp2j7#
我发现在选项卡布局上设置一个侦听器会阻止调用它,可能是因为
tabLayout.setOnTabSelectedListener
上只有一个侦听器的空间,而不是一个侦听器数组。