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
才不是.
Jra*_*o11 156
使用a FragmentStatePagerAdapter
并没有完全解决我的问题,这是一个类似的问题,onCreateView
在视图寻呼机中没有被调用子片段.我实际上将我的FragmentPagerAdapter
内部嵌套在另一个内部,Fragment
因此FragmentManager
在所有这些内容中共享,从而保留了旧片段的实例.修复是将一个实例提供getChildFragmentManager
给FragmentPagerAdapter
我的宿主片段的构造函数.就像是...
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)
该getChildFragmentManager()
方法可以通过片段访问,这对我有用,因为它FragmentManager
为该片段返回一个私有,专门用于需要嵌套片段的情况.我希望这可以帮助那些可能遇到同样问题的人!
getChildFragmentManager()
您的最低API版本必须至少17 (4.2)
,因此这可能会给您的齿轮带来麻烦.当然,如果您使用支持库v4中的片段,那么您应该没问题.覆盖 long getItemId (int position)
FragmentPagerAdapter
缓存它使用getItem
. 我面临着同样的问题 - 即使在notifyDataSetChanged()
getItem
没有被调用之后。
这实际上是一个功能,而不是一个错误。您需要覆盖,getItemId
以便您可以正确地重用您的片段。由于您正在移除碎片,因此您的位置正在发生变化。如文档中所述:
long getItemId (int position)
返回给定位置的项目的唯一标识符。
默认实现返回给定的位置。如果项目的位置可以改变,子类应该覆盖这个方法。
只需为每个片段提供一个唯一的 id,你就完成了。
使用FragementStatePagerAdapter
或返回POSITION_NONE
的int getItemPosition (Object object)
是错误的。你不会得到任何缓存。
我做了@kanika和@ Jraco11所发布的内容,但仍然有问题。
因此,经过大量更改,我发现了一个对我有用的文件,并将下一个代码添加到了FragmentPagerAdapter中:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)
根据我所读的内容,getItemPosition用于通知ViewPager是否刷新项目,并且如果可见位置的项目没有更改,则避免更新。
归档时间: |
|
查看次数: |
34185 次 |
最近记录: |