我有一个ViewPager(扩展FragmentPagerAdapter),它包含两个片段.我需要的是当我在它们之间滑动时为每个片段刷新ListView.为此,我实现了ViewPager.OnPagechangelistener接口(即onPageScrollStateChanged).为了保存对Fragments的引用,我使用了HashTable.我在getItem()方法中存储对HashTable中的Fragments的引用:
@Override
        public Fragment getItem(int num) {
            if (num == 0) {
                Fragment itemsListFragment = new ItemsListFragment();
                mPageReferenceMap.put(num,itemsListFragment);
                return itemsListFragment;
            } else {
                Fragment favsListFragment = new ItemsFavsListFragment();
                mPageReferenceMap.put(num,favsListFragment);
                return favsListFragment;
            }
        }

因此,当我从一个片段滑动到另一个片段时,onPageScrollStateChanged触发我使用HashTable在两个片段中调用所需方法(刷新):

public void refreshList() {
        ((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
        ((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
    }

一切顺利,直到方向改变事件发生.之后是refresh()方法中的代码,它是:

public void refresh() {
        mAdapter.changeCursor(mDbHelper.getAll());
        getListView().setItemChecked(-1,true); // The last row from a exception trace finishes here (my class).
    }

导致IllegalStateException:

java.lang.IllegalStateException: Content view not yet created
        at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
        at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
        at ebeletskiy.gmail.com.passwords.ui.ItemsFavsListFragment.refresh(ItemsFavsListFragment.java:17)

假设确实没有创建Content视图,我将onActivityCreated()方法中的boolean变量设置为true,并使用if / else条件来调用getListView(),这显示了成功创建的活动和内容视图.

然后我正在调试以查看FragmentPagerAdapter何时调用getItem(),并且在方向更改事件之后不会调用该方法.所以看起来ViewPager持有对旧片段的引用.这只是我的假设.

那么,有没有办法强制ViewPager再次调用getItem(),所以我可以使用对当前片段的正确引用?可能是其他一些解决方案?非常感谢你.

解决方法

Then I was debugging to see when FragmentPagerAdapter invokes getItem() and it happens the method is not called after orientation change event. So looks like it ViewPager holds references to old Fragments.

应该自动重新创建片段,就像配置更改中的任何片段一样.例外情况是你使用了setRetainInstance(true),在这种情况下它们应该是和以前一样的片段对象.

So,is there any way to enforce the ViewPager to call getItem() again,so I can use proper references to current Fragments?

这些碎片有什么问题?

android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?的更多相关文章

  1. android – 在listview中添加viewpager作为滚动标题

    我试图在列表标题中添加Viewpager(使用支持库4),但它没有显示任何内容.这是我的代码请帮忙.它将在列表标题中不作为项目,因此它不应该是一个问题.解决方法listadapter之后的listview页眉和页脚显示.如果你尝试setadapter,并且看不到viewpager.检查viewpager的宽度和高度.如果viewpager的宽度或高度值为0.在viewgroup中创建LienarL

  2. 从ViewPager Fragments中隐藏Android应用程序中的软键盘

    我有一个Android应用程序,其中包含一个包含2个片段的ViewPager.第一个片段包含EditText字段.当应用程序启动时,该字段立即获得焦点并启动软键盘.第二个片段仅包含一个列表.当我从片段1滑动到片段2时,我希望键盘能够消失.我尝试过的任何东西似乎都没有用.键盘不仅保持在视图中,还继续更新片段1的EditText字段.我想我要么使用不正确的代码来隐藏键盘或将其放在错误的位置.如果任何人都可以发布正确实现的示例,将不胜感激!

  3. android – Slider Menu片段中的可交换选项卡

    我已经通过引用thistutorial实现了导航抽屉,现在我想要做的是在片段内显示滑动标签.即当我点击导航抽屉中的一个项目时,让我们说第一个项目,它应显示该项目的滑动标签.如果item1是Events,当我点击它时,它应该显示滑动标签.但我面临以下问题:–>如何在片段内实现视图寻呼机?

  4. android – 如何在ViewPager中使用cursorLoader?

    解决方法我无法评论,所以我正在写一个答案..您有一个实现LoaderCallbacks的活动.加载数据时,您的活动会收到onLoadFinished回调.在此方法中,您有一个应该在ViewPager中显示的Cursor.要显示Cursor中的数据,请在适配器上调用swapCursor方法.因此,每次加载数据时都不要创建适配器.创建一次,然后只需调用swapCursor即可.此外,每次都找不到ViewPager–findViewById是一个繁重的操作,它应该在创建视图层次结构后执行.所以,你的onLoad

  5. android – FragmentPagerAdapter不会在方向更改时重新创建片段吗?

    可能是其他一些解决方案?这些碎片有什么问题?

  6. android – Horizo​​ntalScrollView还是Carrousel?

    我在SO上找到的最接近的例子是here.这正是我需要的,但我已经测试了给出的答案,但它对我不起作用……但问题中的图像正是我想要的.任何人都可以指导我这样做吗?编辑2:根据你给出的两个例子,你看过this和this吗?这就是你要找的东西吗?

  7. 选项卡图标和文本均使用android设计支持库

    解决方法你是什么意思未被选中.你能分享一下你想要达到的目标以及你现在所处的位置.我不推荐你的做法.它做了很多不需要的东西来解决你的问题.我建议使用TabLayout类中的图标和文本,只需设置图标和文本.或者,如果需要,甚至是自定义布局,但使用TabLayout中的text1和图标.这样做有什么问题吗?

  8. Android在FragmentPagerAdapter中的Fragment中设置TextView文本

    更新:那么做这样的事情?

  9. android – 为什么ViewPager中的第一个视图显示为空?

    我有一个使用以下适配器的viewpager,在加载后,第一个视图显示为空,但事实并非如此.如果我滚动到下一个视图,然后向后滚动,我可以看到内容.以下是从我的活动中实现它的代码……解决方法尝试添加followindonCreate方法,我的代码工作.也许只是因为在不合适的时间调用resetPages()?

  10. Android ViewPager CrossFade动画

    我为android实现了BottomNavigation视图,我有一些片段显示为BottomNavigation页面.根据GoogleMaterialDesignGuideLines我想用交叉淡入淡出动画显示片段.通过触摸BottomNavigation的项目,我的ViewpPager使用默认幻灯片动画更改片段.我在this和this阅读了一些解决方案.但这些并不是真正的淡入淡出动画,我无法设置渐

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部