在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).