首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ViewPager中使用FragmentPagerAdapter的片段在第二次查看时为空白

在这个问题中,我们讨论了ViewPager中使用FragmentPagerAdapter的片段在第二次查看时为空白的问题。这个问题可能是由于FragmentPagerAdapter的缓存机制导致的。

首先,我们需要了解FragmentPagerAdapter的工作原理。FragmentPagerAdapter是一个PagerAdapter的子类,它会根据需要创建和销毁Fragment。当一个Fragment被销毁时,它会被保存在FragmentManager的缓存中,以便在需要时重新使用。这种方法可以提高性能,但有时会导致问题,如在第二次查看时出现空白。

为了解决这个问题,我们可以考虑以下几种方法:

  1. 重写FragmentPagerAdapter的destroyItem方法。在这个方法中,我们可以移除Fragment的视图,并将其从缓存中移除。这样,当我们需要重新创建Fragment时,它将不会从缓存中获取,而是重新创建一个新的Fragment。
代码语言:java
复制
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    containerView.removeView(((Fragment) object).getView());
}
  1. 使用FragmentStatePagerAdapter替换FragmentPagerAdapter。FragmentStatePagerAdapter是另一个PagerAdapter的子类,它会在需要时保存和恢复Fragment的状态,而不是保存整个Fragment。这样,我们可以避免空白的问题,同时提高性能。
代码语言:java
复制
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
    // ...
}
  1. 在Fragment的setUserVisibleHint方法中更新数据。当Fragment变为可见或不可见时,setUserVisibleHint方法会被调用。我们可以在这个方法中更新数据,以确保数据在Fragment被重新创建时是最新的。
代码语言:java
复制
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // 更新数据
    }
}

总之,解决ViewPager中使用FragmentPagerAdapter的片段在第二次查看时为空白的问题,可以通过重写destroyItem方法、使用FragmentStatePagerAdapter或在setUserVisibleHint方法中更新数据来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter)ViewPager+FragmentPagerAdapte

不由得有些好奇,随跟踪了部分源码,简单整理如下: ViewPager+FragmentPagerAdapter为何不能通过setAdapter做到整体刷新 第二次设置PagerAdapter时候,首先会将原来...为什么呢,因为第二次setAdapter时候,已经被FragmentManager缓存Fragent不会被新建,也不会被刷新,因为FragmentPagerAdapter调用destroy时候,...,自己Fragment缓存列表取不到,就新建。...FragmentPagerAdapter如何通过notifyDataSetChanged刷新ViewPager FragmentPagerAdapter数据发生改变,往往要重新将数据设置到Fragment...对于ViewPager使用FragmentPagerAdapter/FragmentStatePagerAdapter时候都不会addToBackStack,这也是为什么detach跟remove有时候表现一致或者不一致原因

3.3K20

ViewPager 获取当前显示Fragment

Viewpager 获取当前显示fragment 使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter...方法找到它;但问题是动态创建的话 tag设置;我们知道动态加载是可以设置tag,但是动态创建就没法设置了;如果viewpager使用是适配器是 FragmentPagerAdapter 的话...tag null E/FileListPagerAdapter: ====getItem===新创建tag:==null 将 适配器设置给Viewpagertag E/MainActivity...而 object参数就是显示Fragment ;可以适配器定义个变量 currentFragment 每次改变都会获取到显示Fragment @Override public void setPrimaryItem...viewpager滑动监听执行完后才会调用;所以个滑动监听获取当前显示Fragment 是不对

3.7K80
  • FragmentPagerAdapter 滑动过后界面不显示解决方案

    最近工作UI给出如图设计,心想这个结合viewpager,fragment,FragmentPagerAdapter就能构建出来. ?...立马getItem代码打断点,发现左右滑动压根就没有调用getItem方法....结合其他google结果,大致意为FragmentPagerAdapter中所创建出来fragment会被fragment manager保存,也即在内存....实际运行时,滑动时会直接去内存寻找.这样问题就可以断定为fragment再次添加到界面时数据丢失了,没有保存下来.这样就好办了,我们frament做数据保存处理即可.fragment中加入类似代码...结论:FragmentPagerAdapterviewpager滑动白屏无数据,是由于恢复内存fragment数据丢失,需要自己做手动数据保存,这样才能避免此情况出现.

    1.2K30

    解决ViewPager+多Fragment切换出现空白页面的问题

    项目的主页框架是采用Activity+Fragment架构,由于项目需求,第一个Fragment又采用是TabLayout+ViewPager+Fragment结构,假设我这里有5个子Fragment...,第一个子Fragment中有控件、数据这些东西,当我从第1个滑动到第5个Fragment,再往回滑到第1个Fragment时候,我第一个Fragment控件没了,页面是空白。...第一种:将ViewPager预加载个数设置所有Fragment数量,就是说有几个Fragment就设为几。...第三种:这种方式是在网上看到,我没有实际操作过,这种要比上面两种复杂一点,这里说一下思路:onCreateView()判断Fragment是否已经添加了contentView,第一次加载,可以将...view保存下来,之后再加载判断保存view是否空,如果空,则return新加载view,如果不为空,先将保存view从父view移除,然后再return该view。

    1.7K30

    Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment

    并命名其为“Fragment最佳实践”,作为想到单独使用Fragment用户来说,这个说法并不夸大,它解决了许多用户使用Fragment产生这样那样可见或不可见问题。...我们布局文件可以这样使用 。...TabLayout动态使用 布局文件我们可以很方便定义顶部/底部 导航布局。...TabLayout更多属性 关于TabLayout更多属性以及使用说明请查看其官方文档。在这里我们只关心TabLayout+ViewPager化学反应,这个组合也是我们平常在开发中使用最多。...Fragment可见,即ViewPager滑动到当前页面,因为已经预加载过了,之前生命周期已经走到onResume() ,所以现在只会回调:setUserVisibleHint()。

    1.7K10

    android之FragmentPagerAdapter和FragmentStatePagerAdapter

    FragmentPagerAdapter,见名知意,这个适配器就是用来实现FragmentViewPager里面进行滑动切换,因此,如果我们想实现Fragment左右滑动,可以选择ViewPager...FragmentPagerAdapter拥有自己缓存策略,当和ViewPager配合使用时候,会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象。...原理 假如有三个Fragment,那么ViewPager初始化之后,3个fragment都会加载完成。...如果应用场景是更多Fragment,请使用FragmentStatePagerAdapter。...该 PagerAdapter 实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示,生成新页面。这么实现好处就是当拥有大量页面,不必在内存占用大量内存。

    1.9K20

    AndroidFragment+ViewPager配合使用

    官方推荐 ViewPager与Fragment一起使用,可以更加方便管理每个Page生命周期,这里有标准适配器实现用于ViewPager和Fragment,涵盖最常见用例。...num区别标签,其实具体应用可以使用真实fragment对象来作为叶片         mNum = getArguments() !...效果与ViewPager添加View效果是一样!但是它与View区别在于它有自己生命周期,可以随时更改自己状态便于管理。...事实上使用FragmentPagerAdapter ,Fragment对象会一直存留在内存,所以当有大量显示页,就不适合用FragmentPagerAdapter了,FragmentPagerAdapter...这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter ,如果Fragment不显示,那么Fragment对象会被销毁,(

    1K100

    ViewPager 详解(五)—–使用Fragment实现ViewPager滑动

    前言:前几篇文章讲解了ViewPager普通实现方法,但android官方最推荐一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)...第二页面向第三个页面滑动 一、概述 从前面几篇文章,我们知道,实现ViewPager是要有适配器,我们前面用适配器是PagerAdapter,而对于fragment,它所使用适配器是...每一个使用FragmentPagerAdapterViewPager都要有一个有效ID集合,有效ID集合就是Fragment集合(感谢夫诸同学提示) 对于FragmentPagerAdapter...", Toast.LENGTH_SHORT).show(); } }); return view; } } onCreateView()返回要显示View,上面这段代码简单演示了如何对视图里控件进行操作...4、可能出现问题 问题:MainActivity,当写到这句:fragments.add(new Fragment1()); 向Fragment列表添加Fragement对象实例,会提示“无法将

    1.4K20

    Android开发:ViewPage最详细教程

    定义 ViewPager是android扩展包v4包类 android.support.v4.view.ViewPager 作用 左右切换当前view,实现滑动切换效果。...使用这个类之前,必须明白: 1.ViewPager类直接继承了ViewGroup类,和LinearLayout等布局一样,都是一个容器,需要在里面添加我们想要显示内容。...2.ViewPager类需要PagerAdapter适配器类提供数据,与ListView类似 使用 建立ViewPage步骤: 1....Activity里绑定Adapter ViewPagerAdapter: private ViewPager viewPager; viewPager.setAdapter(new MyViewPagerAdapter...即当拥有大量页面使用FragmentStatePagerAdapter不必在内存占用大量内存 总结 本文对ViewPage进行了全面的介绍,接下来我会介绍继续介绍Android开发相关知识

    3K41

    关于Android导航页开发体会

    2019独角兽企业重金招聘Python工程师标准>>> 最近尝试做一个有社交网络服务和IM服务项目,想使用比较流行方式实现程序导航,一开始 借鉴了网上DrawerLayout加ViewPager...,Fragment,FragmentPagerAdapter,由于网上例子 很多,主要写一些体会 程序界面: 大类实现(我把底端导航称为大类) 采用一组RadioGroup,onCheckedChanged...方法给出Fragment切换规则 使用selectorRadioButton设置触发响应 Fragment内容填充一个FrameLayout布局(注意设置layout_weight...以保证占满屏幕) 中间分割线可以考虑通过ImageView来实现(设置高度1dp,background灰) 小类下细分(使用ViewPager+FragmentPagerAdapter实现...注意使用getChildFragmentManager,因为如果在Fragment嵌套Fragment,要用 getChildFragmentManager 例子: mPager.setAdapter

    26120

    ViewPager使用FragmentPagerAdapter适配器

    前言:昨晚在做课程设计结构遇到了二级Fragment(Fragment里面嵌入了ViewPager),在数据显示时候,如果使用简单PagerAdapter的话,代码在这个适配器里面会造成庞大不好效果...,不仅仅如此,使用mvp模式,Presenter就会跑到adapter里面,虽然adapter属于view图层,但是不利于数据处理。...然而我找到了一个比较推荐方法:ViewPager使用FragmentPagerAdapter适配器。...()); viewPager.setAdapter(adapter); 上面的俩个Activity实现区别就是前者Fragment实现,后者Activity实现 本质上就是FragmentManager...,两个类导入Fragment包不一致 解决 将两个Fragment包都导入ndroid.support.v4.app.Fragment即可

    3K30
    领券