public abstract class FragmentStatePagerAdapter
extends PagerAdapter
| java.lang.Object | ||
| android.support.v4.view.PagerAdapter | ||
| android.support.v4.app.FragmentStatePagerAdapter | ||
执行PagerAdapter ,使用Fragment来管理每个页面。 该类还处理片段状态的保存和恢复。
当有大量页面时,此版本的寻呼机更有用,工作更像列表视图。 当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态。 这使得寻呼机可以保持与每个访问页面相关的少得多的存储器,与FragmentPagerAdapter相比,在页面之间切换时可能会产生更多开销。
当使用FragmentPagerAdapter时,主机ViewPager必须有一个有效的ID集。
子类只需要实现 getItem(int)和 getCount()以具有工作适配器。
以下是包含列表片段的寻呼机的示例实现:
public class FragmentStatePagerSupport extends Activity {
static final int NUM_ITEMS = 10;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
// Watch for button clicks.
Button button = (Button)findViewById(R.id.goto_first);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPager.setCurrentItem(0);
}
});
button = (Button)findViewById(R.id.goto_last);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPager.setCurrentItem(NUM_ITEMS-1);
}
});
}
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
}
public static class ArrayListFragment extends ListFragment {
int mNum;
/**
* Create a new instance of CountingFragment, providing "num"
* as an argument.
*/
static ArrayListFragment newInstance(int num) {
ArrayListFragment f = new ArrayListFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public void 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
public View 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
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.i("FragmentList", "Item clicked: " + id);
}
}
}
顶级片段的 R.layout.fragment_pager资源是:
<LinearLayout xmlns: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>
<LinearLayout android:orientation="horizontal"
android:gravity="center" android:measureWithLargestChild="true"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0">
<Button android:id="@+id/goto_first"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/first">
</Button>
<Button android:id="@+id/goto_last"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/last">
</Button>
</LinearLayout>
</LinearLayout>
包含每个单独片段布局的 R.layout.fragment_pager_list资源是:
<LinearLayout xmlns: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">
<TextView android: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 -->
<ListView android: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 -->
<TextView android: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>
Inherited constants |
|---|
android.support.v4.view.PagerAdapter
|
Public constructors |
|
|---|---|
FragmentStatePagerAdapter(FragmentManager fm) |
|
公共方法(Public methods) |
|
|---|---|
void |
destroyItem(ViewGroup container, int position, Object object) 删除给定位置的页面。 |
void |
finishUpdate(ViewGroup container) 在所示页面中的更改完成时调用。 |
abstract Fragment |
getItem(int position) 返回与指定位置关联的碎片。 |
Object |
instantiateItem(ViewGroup container, int position) 创建给定位置的页面。 |
boolean |
isViewFromObject(View view, Object object) 确定页面视图是否与 |
void |
restoreState(Parcelable state, ClassLoader loader) 还原与此适配器及其先前由 |
Parcelable |
saveState() 如果需要重建当前UI状态,请保存与此适配器及其应恢复的页面关联的任何实例状态。 |
void |
setPrimaryItem(ViewGroup container, int position, Object object) 被调用以通知适配器当前哪个项目被认为是“主要”,这是向用户显示的当前页面。 |
void |
startUpdate(ViewGroup container) 当所显示页面的变化即将开始时调用。 |
继承方法(Inherited methods) |
|
|---|---|
android.support.v4.view.PagerAdapter
|
|
java.lang.Object
|
|
FragmentStatePagerAdapter (FragmentManager fm)
| 参数(Parameters) | |
|---|---|
fm |
FragmentManager
|
void destroyItem (ViewGroup container, int position, Object object)
删除给定位置的页面。 适配器负责从容器中移除视图,尽管它只能确保在从finishUpdate(ViewGroup)返回时完成finishUpdate(ViewGroup) 。
| 参数(Parameters) | |
|---|---|
container |
ViewGroup: The containing View from which the page will be removed. |
position |
int: The page position to be removed. |
object |
Object: The same object that was returned by instantiateItem(View, int). |
void finishUpdate (ViewGroup container)
在所示页面中的更改完成时调用。 此时,您必须确保所有页面实际上已根据需要添加或从容器中移除。
| 参数(Parameters) | |
|---|---|
container |
ViewGroup: The containing View which is displaying this adapter's page views. |
Fragment getItem (int position)
返回与指定位置关联的碎片。
| 参数(Parameters) | |
|---|---|
position |
int
|
| 返回(Returns) | |
|---|---|
Fragment |
|
Object instantiateItem (ViewGroup container, int position)
创建给定位置的页面。 适配器负责将视图添加到此处给出的容器,但它只能确保在从finishUpdate(ViewGroup)返回时完成此操作。
| 参数(Parameters) | |
|---|---|
container |
ViewGroup: The containing View in which the page will be shown. |
position |
int: The page position to be instantiated. |
| 返回(Returns) | |
|---|---|
Object |
Returns an Object representing the new page. This does not need to be a View, but can be some other container of the page. |
boolean isViewFromObject (View view, Object object)
确定页面视图是否与instantiateItem(ViewGroup, int)返回的特定键对象相关联。 这个方法对于PagerAdapter正常运行是必需的。
| 参数(Parameters) | |
|---|---|
view |
View: Page View to check for association with object |
object |
Object: Object to check for association with view |
| 返回(Returns) | |
|---|---|
boolean |
true if view is associated with the key object object |
void restoreState (Parcelable state, ClassLoader loader)
还原与此适配器及其先前由 saveState()保存的页面关联的任何实例状态。
| 参数(Parameters) | |
|---|---|
state |
Parcelable: State previously saved by a call to saveState() |
loader |
ClassLoader: A ClassLoader that should be used to instantiate any restored objects |
Parcelable saveState ()
如果需要重建当前UI状态,请保存与此适配器及其应恢复的页面关联的任何实例状态。
| 返回(Returns) | |
|---|---|
Parcelable |
Saved state for this adapter |
void setPrimaryItem (ViewGroup container, int position, Object object)
被调用以通知适配器当前哪个项目被认为是“主要”,这是向用户显示的当前页面。
| 参数(Parameters) | |
|---|---|
container |
ViewGroup: The containing View from which the page will be removed. |
position |
int: The page position that is now the primary. |
object |
Object: The same object that was returned by instantiateItem(View, int). |
void startUpdate (ViewGroup container)
当所显示页面的变化即将开始时调用。
| 参数(Parameters) | |
|---|---|
container |
ViewGroup: The containing View which is displaying this adapter's page views. |