Android FragmentPagerAdapter翻译

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)
当页面将要被显示时调用
原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3591948.html