public abstract class
FragmentPagerAdapter
extends PagerAdapter
java.lang.Object | ||
? | android.support.v4.view.PagerAdapter | |
? | android.support.v4.app.FragmentPagerAdapter |
Class Overview
它是PagerAdapter的一种实现,每一个页面都是一个Fragment,并且每一个页面都会保存到fragment manager中,当用户没有可能回到该页面时fragment manager才会将这个fragment销毁。
这种页面十分适用于有一些静态的fragment,例如一组tabs,用户访问的每一个页面都会保存在内存中,尽管当view不可见时可能会被销毁。这就会导致应用程序会占用太多的资源,所以,通常当页面数据量过大时使用FragmentStatePagerAdapter来代替FragmentPagerAdapter
当使用FragmentPageAdapter时ViewPager必须有一个ID。
子类只需要实现适配器的getItem(int)和getCount()方法
下面是官方给出的一个例子:
publicclassFragmentPagerSupportextendsFragmentActivity{
staticfinalint NUM_ITEMS =10;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter =newMyAdapter(getSupportFragmentManager());
mPager =(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
// Watch for button clicks.
Button button =(Button)findViewById(R.id.goto_first);
button.setOnClickListener(newOnClickListener(){
publicvoid onClick(View v){
mPager.setCurrentItem(0);
}
});
button =(Button)findViewById(R.id.goto_last);
button.setOnClickListener(newOnClickListener(){
publicvoid onClick(View v){
mPager.setCurrentItem(NUM_ITEMS-1);
}
});
}
publicstaticclassMyAdapterextendsFragmentPagerAdapter{
publicMyAdapter(FragmentManager fm){
super(fm);
}
@Override
publicint getCount(){
return NUM_ITEMS;
}
@Override
publicFragment getItem(int position){
returnArrayListFragment.newInstance(position);
}
}
publicstaticclassArrayListFragmentextendsListFragment{
int mNum;
/**
* Create a new instance of CountingFragment, providing "num"
* as an argument.
*/
staticArrayListFragment newInstance(int num){
ArrayListFragment f =newArrayListFragment();
// Supply num input as an argument.
Bundle args =newBundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
/**
* When creating, retrieve this instance‘s number from its arguments.
*/
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mNum = getArguments()!=null? getArguments().getInt("num"):1;
}
/**
* The Fragment‘s UI is just a simple text view showing its
* instance number.
*/
@Override
publicView onCreateView(LayoutInflater inflater,ViewGroup container,
Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_pager_list, container,false);
View tv = v.findViewById(R.id.text);
((TextView)tv).setText("Fragment #"+ mNum);
return v;
}
@Override
publicvoid onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setListAdapter(newArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,Cheeses.sCheeseStrings));
}
@Override
publicvoid onListItemClick(ListView l,View v,int position,long id){
Log.i("FragmentList","Item clicked: "+ id);
}
}
}
The R.layout.fragment_pager
resource of the top-level
fragment is:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent"android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1">
</android.support.v4.view.ViewPager>
<LinearLayoutandroid:orientation="horizontal"
android:gravity="center"android:measureWithLargestChild="true"
android:layout_width="match_parent"android:layout_height="wrap_content"
android:layout_weight="0">
<Buttonandroid:id="@+id/goto_first"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:text="@string/first">
</Button>
<Buttonandroid:id="@+id/goto_last"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:text="@string/last">
</Button>
</LinearLayout>
</LinearLayout>
The R.layout.fragment_pager_list
resource containing
each individual fragment‘s layout is:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:drawable/gallery_thumb">
<TextViewandroid:id="@+id/text"
android:layout_width="match_parent"android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/hello_world"/>
<!-- The frame layout is here since we will be showing either
the empty view or the list view. -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1">
<!-- Here is the list. Since we are using a ListActivity, we
have to call it "@android:id/list" so ListActivity will
find it -->
<ListViewandroid:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false"/>
<!-- Here is the view to show if the list is emtpy -->
<TextViewandroid:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="No items."/>
</FrameLayout>
</LinearLayout>
Summary
[Expand]
Inherited Constants
| |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
From
class android.support.v4.view.PagerAdapter
|
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
FragmentPagerAdapter(FragmentManager fm) 构造方法,需要传入一个FragmentManager |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
destroyItem(ViewGroup container,
int position, Object object)
根据给定的position移除一个page页
|
||||||||||
void |
finishUpdate(ViewGroup container)
当页面数据加载完成时调用该方法
|
||||||||||
abstract Fragment |
getItem(int
position)
返回指定位置的相关fragment
|
||||||||||
long |
getItemId(int
position)
返回给定位置的item的标示符
|
||||||||||
Object |
instantiateItem(ViewGroup container,
int position)
在给定的位置处创建一个page
|
||||||||||
boolean |
isViewFromObject(View view, Object object)
Determines whether a page View is associated with
a specific key object as returned by
instantiateItem(ViewGroup,
int) . |
||||||||||
void |
restoreState(Parcelable state, ClassLoader loader)
恢复所有的通过saveState()方法保存的与adapter关联的页面实例状态
|
||||||||||
Parcelable |
saveState()
保存所有与adapter相关的页面实例。直到调用restoreState方法是恢复
|
||||||||||
void |
setPrimaryItem(ViewGroup container,
int position, Object object)
Called to inform the adapter of which item is
currently considered to be the "primary", that is the one show to the user
as the current page.
|
||||||||||
void |
startUpdate(ViewGroup container)
当页面将要被显示时调用
|