FragmentPagerAdapter和FragmentStatePagerAdapter

在Fragment和ViewPager结合使用的时候。会用到PagerAdapter作为ViewPager的适配器。通常在实现ViewPager的时候,我们需要自己定义ViewPager,而在Fragment和ViewPager结合使用的时候。官方为我们提供了两个实现类FragmentPagerAdapter和FragmentStatePagerAdapter来帮助我们更快的实现效果。

1.官方定义

首先翻译一下官方文档的说明,明白这个两个PagerAdapter的官方定义。

 

1.1 FragmentPagerAdapter文档翻译

/**
 * Implementation of {@link PagerAdapter} that
 * represents each page as a {@link Fragment} that is persistently
 * kept in the fragment manager as long as the user can return to the page.
 */
是对于PagerAdapter的实现,每个页面的Fragment都长时间保存在(fragment manager)fragment 管理器中,只要用户能够返回到页面。
/* <p>This version of the pager is best for use when there are a handful of
 * typically more static fragments to be paged through, such as a set of tabs.
 * The fragment of each page the user visits will be kept in memory, though its
 * view hierarchy may be destroyed when not visible.  This can result in using
 * a significant amount of memory since fragment instances can hold on to an
 * arbitrary amount of state.  For larger sets of pages, consider
 * {@link FragmentStatePagerAdapter}.
 */
 这个版本的页面适用于当只有少数,通常是静态的fragment就行分页的时候使用,例如和tab结合使用。
 每个用户访问过的fragment都会一直存储在内存中。即使他的视图结构因为不可见而销毁。
 这可能导致占用大量内存,因为fragment实例可能是任意数量的。对于更大数量的页面,考虑使用FragmentStatePagerAdapter。
 
 /* <p>When using FragmentPagerAdapter the host ViewPager must have a
 * valid ID set.</p>
 */
  当用使用FragmentPagerAdapter的时候宿主ViewPager必须有一个有效的ID集。
 /* <p>Subclasses only need to implement {@link #getItem(int)}
 * and {@link #getCount()} to have a working adapter.
 */
  子类只需要实现getItem(int)和getCount()方法就可以拥有一个可以工作的adapter.
 /* <p>Here is an example implementation of a pager containing fragments of
 * lists:
 */

    这里有一个实现了包含多个fragment的页面列表的例子。
    下面列出了地址。
/* {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
 *      complete}
 *
 * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
 *
 * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager.xml
 *      complete}
 *
 * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
 * individual fragment's layout is:
 *
 * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
 *      complete}
 */
public abstract class FragmentPagerAdapter extends PagerAdapter 

文档写的非常清楚,当页面比较少的时候用这个实现类,当视图不可见,fragment还是在内存中保存。会占用比较多的内存。如果页面很多的话,考虑用FragmentStatePagerAdapter。

优点:cpu开销小(不要频繁创建销毁fragment),速度快.

缺点:占用内存大。

1.2 FragmentStatePagerAdapter

/**
 * Implementation of {@link PagerAdapter} that
 * uses a {@link Fragment} to manage each page. This class also handles
 * saving and restoring of fragment's state.
 **/
这是PagerAdapter的实现类,用fragment来管理每个页面。这个类同样用来保存和恢复fragment的状态。
/**<p>This version of the pager is more useful when there are a large number
 * of pages, working more like a list view.  When pages are not visible to
 * the user, their entire fragment may be destroyed, only keeping the saved
 * state of that fragment.  This allows the pager to hold on to much less
 * memory associated with each visited page as compared to
 * {@link FragmentPagerAdapter} at the cost of potentially more overhead when
 * switching between pages.
 */
 当有很大数量的页面的时候,这个版本的页面会更有用,就像列表视图(list view)一样。
 当页面对用户不可见的时候,整个fragment可能被销毁,只保留fragment的状态。
 这让访问过的页面占用更少的内存,和FragmentPagerAdapter相比较的话。当代价是当页面切换的时候开销(CPU)更大。
/* <p>When using FragmentPagerAdapter the host ViewPager must have a
 * valid ID set.</p>
 */
 当用使用FragmentPagerAdapter的时候宿主ViewPager必须有一个有效的ID集。
 /* <p>Subclasses only need to implement {@link #getItem(int)}
 * and {@link #getCount()} to have a working adapter.
 */
子类只需要实现getItem(int)和getCount()方法就可以拥有一个可以工作的adapter.
 /* <p>Here is an example implementation of a pager containing fragments of
 * lists:
 */
    这里有一个实现了包含多个fragment的页面列表的例子。
    下面列出了地址。
/* {@sample frameworks/support/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentStatePagerSupport.java
 *      complete}
 * 
  
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
 * 
 * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager.xml
 *      complete}
 *
 * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
 * individual fragment's layout is:
 *
 * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager_list.xml
 *      complete}
 */
public abstract class FragmentStatePagerAdapter extends PagerAdapter

当页面比较多的时候使用这个实现类,当页面不可见的时候,会从内存销毁,类似于ListView。占用内存较小。

优点:占用内存小。

缺点:cpu开销大(需要频繁的创建销毁fragment).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,从 AndroidX 1.3.0 版本开始,FragmentPagerAdapterFragmentStatePagerAdapter 被标记为过时的。如果你使用的是这两个类,建议你将它们替换为 FragmentStateAdapterFragmentStateAdapter 是 ViewPager2 所使用的适配器类,它提供了更好的性能和更好的数据管理方式。你可以通过以下步骤来替换 FragmentPagerAdapter: 1. 引入 ViewPager2 的依赖库。在 build.gradle 文件中添加以下依赖: ``` implementation 'androidx.viewpager2:viewpager2:1.0.0' ``` 2. 创建一个新的 FragmentStateAdapter 子类,并实现以下方法: - getItemCount():返回要在 ViewPager2 中显示的项目数。 - createFragment():创建要显示的 Fragment 实例。 ``` public class MyFragmentStateAdapter extends FragmentStateAdapter { public MyFragmentStateAdapter(FragmentManager fragmentManager, Lifecycle lifecycle) { super(fragmentManager, lifecycle); } @Override public int getItemCount() { return 3; // 返回要显示的 Fragment 数量 } @Override public Fragment createFragment(int position) { // 返回要显示的 Fragment 实例 switch (position) { case 0: return new MyFragment1(); case 1: return new MyFragment2(); case 2: return new MyFragment3(); default: return null; } } } ``` 3. 在布局文件中将 ViewPager 替换为 ViewPager2: ``` <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager2" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 4. 在代码中使用新的适配器类: ``` ViewPager2 viewPager2 = findViewById(R.id.viewPager2); viewPager2.setAdapter(new MyFragmentStateAdapter(getSupportFragmentManager(), getLifecycle())); ``` 这样,你就成功地替换了 FragmentPagerAdapter。新的适配器类提供了更好的性能和更好的数据管理方式,可以帮助你更好地开发应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值