据我所知,viewpager的屏幕外页面限制必须至少为1.我正在尝试动态更改浏览器中的片段,因为我不断从服务器获取信息。 例如,当我查看片段B时,我有片段A,B,C实例化。 我想更改Fragment A的信息,所以我更新它并调用notifyDataSetChanged()。我没有创建一个新的片段并将其插入其位置,但更改了与原始片段关联的imageview。
然而,一旦我尝试导航到A,我遇到一个错误,说“片段当前不在FragmentManager中”
有人可以向我解释我是如何在浏览器中的直接页面之间来回跳转,同时允许这些页面改变他们的观点吗?
答案 0 :(得分:1)
我没有这样做,但我的建议是不要尝试。 Android在幕后引入了很多魔力,你很可能会在尝试实现你想要的东西时遇到很多问题。当我尝试为每个列表项保存contentView时,我有使用ListView的经验,因此Android只会渲染一次,因为每次我放弃了这个想法,因为我每次都更改了默认行为,出现了新的问题(例如视图中有两个父母的例外情况)。我设法实现了这一点,但代码非常糟糕。
为什么不尝试,例如,保存您已下载到光盘上的图像,并检索片段是否实际出现在屏幕上?在这种情况下,毕加索图书馆可以提供帮助
答案 1 :(得分:0)
为此,您应创建一个FragmentPagerAdapter
,以便在创建页面时保存对其的引用。像这样:
public class MyPagerAdapter extends FragmentPagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:
return MyListFragment.newInstance(TAB_NAME_A);
case 1:
return MyListFragment.newInstance(TAB_NAME_B);
case 2:
return MyListFragment.newInstance(TAB_NAME_C);
default:
return null;
}
}
@Override
public int getCount() {
// Show 3 total pages.
return TOTAL_PAGES;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}
您可以访问这样的特定页面:
((MyListFragment) myPagerAdapter.getRegisteredFragment(0)).updateUI();
其中updateUI()是一种自定义方法,用于更新该页面上的列表并调用notifyDataSetChanged()
。