Most visited

Recently visited

FragmentStatePagerAdapter

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>

Summary

Inherited constants

From class 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)

确定页面视图是否与 instantiateItem(ViewGroup, int)返回的特定键对象相关联。

void restoreState(Parcelable state, ClassLoader loader)

还原与此适配器及其先前由 saveState()保存的页面相关的任何实例状态。

Parcelable saveState()

如果需要重建当前UI状态,请保存与此适配器及其应恢复的页面关联的任何实例状态。

void setPrimaryItem(ViewGroup container, int position, Object object)

被调用以通知适配器当前哪个项目被认为是“主要”,这是向用户显示的当前页面。

void startUpdate(ViewGroup container)

当所显示页面的变化即将开始时调用。

Inherited methods

From class android.support.v4.view.PagerAdapter
From class java.lang.Object

Public constructors

FragmentStatePagerAdapter

FragmentStatePagerAdapter (FragmentManager fm)

Parameters
fm FragmentManager

Public methods

destroyItem

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

finishUpdate

void finishUpdate (ViewGroup container)

在所示页面中的更改完成时调用。 此时,您必须确保所有页面实际上已根据需要添加或从容器中移除。

Parameters
container ViewGroup: The containing View which is displaying this adapter's page views.

getItem

Fragment getItem (int position)

返回与指定位置关联的碎片。

Parameters
position int
Returns
Fragment

instantiateItem

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.

isViewFromObject

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

restoreState

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

saveState

Parcelable saveState ()

如果需要重建当前UI状态,请保存与此适配器及其应恢复的页面关联的任何实例状态。

Returns
Parcelable Saved state for this adapter

setPrimaryItem

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

startUpdate

void startUpdate (ViewGroup container)

当所显示页面的变化即将开始时调用。

Parameters
container ViewGroup: The containing View which is displaying this adapter's page views.

Hooray!