Android FragmentStatePageAdapter的使用Demo

来源:互联网 发布:淘宝买刀犯法吗 编辑:程序博客网 时间:2024/06/07 04:59

上一篇写过FragmentPagerAdapter,这篇来介绍FragmentStatePagerAdapter,那么两者之间有何区别呢:

FragmentPagerAdapter更多的用于少量界面的ViewPager,比如Tab。划过的fragment会保存在内存中,尽管已经划过。而FragmentStatePagerAdapter和ListView有点类似,会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉。

如果想要更详细的了解,可以查看官网API,下面给出按照官网上写出的Demo:

实现效果图:

源代码:


布局文件:

fragment_pager.xml(布局了ViewPager和两个按钮):

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:gravity="center_horizontal"  
  5.     android:orientation="vertical"  
  6.     android:padding="4dip" >  
  7.   
  8.     <android.support.v4.view.ViewPager  
  9.         android:id="@+id/pager"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="0px"  
  12.         android:layout_weight="1" >  
  13.     </android.support.v4.view.ViewPager>  
  14.   
  15.     <LinearLayout  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_weight="0"  
  19.         android:gravity="center"  
  20.         android:measureWithLargestChild="true"  
  21.         android:orientation="horizontal" >  
  22.   
  23.         <Button  
  24.             android:id="@+id/goto_first"  
  25.             android:layout_width="wrap_content"  
  26.             android:layout_height="wrap_content"  
  27.             android:text="调到首页" >  
  28.         </Button>  
  29.   
  30.         <Button  
  31.             android:id="@+id/goto_last"  
  32.             android:layout_width="wrap_content"  
  33.             android:layout_height="wrap_content"  
  34.             android:text="调到尾页" >  
  35.         </Button>  
  36.     </LinearLayout>  
  37.   
  38. </LinearLayout>  

fragment_pager_list.xml:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:background="@android:drawable/gallery_thumb"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <!-- 该Textview用来显示Fragment的页数 -->  
  8.   
  9.     <TextView  
  10.         android:id="@+id/text"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:gravity="center_vertical|center_horizontal"  
  14.         android:text="@string/hello_world"  
  15.         android:textAppearance="?android:attr/textAppearanceMedium" />  
  16.   
  17.     <!-- 不为空用来显示ListView,如果为空,则显示TextView(数据为空) -->  
  18.   
  19.     <FrameLayout  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="0dip"  
  22.         android:layout_weight="1" >  
  23.   
  24.         <ListView  
  25.             android:id="@android:id/list"  
  26.             android:layout_width="match_parent"  
  27.             android:layout_height="match_parent"  
  28.             android:drawSelectorOnTop="false" />  
  29.   
  30.         <TextView  
  31.             android:id="@android:id/empty"  
  32.             android:layout_width="match_parent"  
  33.             android:layout_height="match_parent"  
  34.             android:text="数据为空"  
  35.             android:textAppearance="?android:attr/textAppearanceMedium" />  
  36.     </FrameLayout>  
  37.   
  38. </LinearLayout>  

代码文件:

MainActivity:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.fragmentdemo13_fragmentstatepageradapter;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.FragmentActivity;  
  5. import android.support.v4.view.ViewPager;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. /** 
  10.  * 这里我们调用的是support.v4的包,所以MainActivity继承的是FragmentActivity,而不是Activity。 
  11.  */  
  12. public class MainActivity extends FragmentActivity {  
  13.     public static final int NUM_ITEMS = 10;  
  14.     private MyAdapter mAdapter;  
  15.     private ViewPager mPager;  
  16.     private Button button_first, button_last;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.fragment_pager);  
  22.         /** 
  23.          * 同样,由于调用的是support.v4的包,这里是getSupportFragmentManager(),而不是getFragmentManager(); 
  24.          */  
  25.         mAdapter = new MyAdapter(getSupportFragmentManager());  
  26.   
  27.         mPager = (ViewPager) findViewById(R.id.pager);  
  28.         mPager.setAdapter(mAdapter);  
  29.         /** 
  30.          * 点击返回首页 
  31.          */  
  32.         button_first = (Button) findViewById(R.id.goto_first);  
  33.         button_first.setOnClickListener(new OnClickListener() {  
  34.             public void onClick(View v) {  
  35.                 mPager.setCurrentItem(0);  
  36.             }  
  37.         });  
  38.         /** 
  39.          * 点击返回尾页 
  40.          */  
  41.         button_last = (Button) findViewById(R.id.goto_last);  
  42.         button_last.setOnClickListener(new OnClickListener() {  
  43.             public void onClick(View v) {  
  44.                 mPager.setCurrentItem(NUM_ITEMS - 1);  
  45.             }  
  46.         });  
  47.   
  48.     }  
  49.   
  50. }  

MyAdapter.java:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.fragmentdemo13_fragmentstatepageradapter;  
  2.   
  3. import android.support.v4.app.Fragment;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.support.v4.app.FragmentStatePagerAdapter;  
  6.   
  7. /** 
  8.  * 这里继承的是FragmentStatePagerAdapter, 根据官方API的介绍,当项目中遇到使用大量的列表页面时,使用该适配器是个更好的选择。 
  9.  * (This version of the pager is more useful when there are a large number of 
  10.  * pages, working more like a list view.) 
  11.  */  
  12. public class MyAdapter extends FragmentStatePagerAdapter {  
  13.   
  14.     public MyAdapter(FragmentManager fm) {  
  15.         super(fm);  
  16.     }  
  17.     /** 
  18.      * 只需要实现下面两个方法即可。 
  19.      */  
  20.     @Override  
  21.     public Fragment getItem(int position) {  
  22.         return ArrayListFragment.newInstance(position);  
  23.     }  
  24.   
  25.     @Override  
  26.     public int getCount() {  
  27.         return MainActivity.NUM_ITEMS;  
  28.     }  
  29.   
  30. }  

ArrayListFragment.java:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.fragmentdemo13_fragmentstatepageradapter;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.os.Bundle;  
  6. import android.support.v4.app.ListFragment;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.ArrayAdapter;  
  11. import android.widget.ListView;  
  12. import android.widget.TextView;  
  13. import android.widget.Toast;  
  14.   
  15. public class ArrayListFragment extends ListFragment {  
  16.     private int mNum;  
  17.     public ArrayList<String> list = new ArrayList<String>();  
  18.   
  19.     /** 
  20.      * 创建一个计算Fragment页面的实例,将怒num作为一个参数。 
  21.      * (Create a new instance of 
  22.      * CountingFragment, providing "num" as an argument.) 
  23.      */  
  24.     public static ArrayListFragment newInstance(int num) {  
  25.   
  26.         ArrayListFragment f = new ArrayListFragment();  
  27.         Bundle args = new Bundle();  
  28.         args.putInt("num", num);  
  29.         f.setArguments(args);  
  30.   
  31.         return f;  
  32.     }  
  33.   
  34.     /** 
  35.      * 当调用该方法时,检索此实例的数量的参数。 
  36.      * (When creating, retrieve this instance's number from 
  37.      * its arguments.) 
  38.      */  
  39.     @Override  
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         mNum = getArguments() != null ? getArguments().getInt("num") : 1;  
  43.     }  
  44.   
  45.     /** 
  46.      * Fragment的UI只显示它所在的页码。 
  47.      * (The Fragment's UI is just a simple text view 
  48.      * showing its instance number.) 
  49.      */  
  50.     @Override  
  51.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  52.             Bundle savedInstanceState) {  
  53.         View view = inflater.inflate(R.layout.fragment_pager_list, container,  
  54.                 false);  
  55.         TextView tv = (TextView) view.findViewById(R.id.text);  
  56.         tv.setText("Fragment #" + mNum);  
  57.         return view;  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onActivityCreated(Bundle savedInstanceState) {  
  62.         super.onActivityCreated(savedInstanceState);  
  63.         setListAdapter(new ArrayAdapter<String>(getActivity(),  
  64.                 android.R.layout.simple_list_item_1, getData()));  
  65.     }  
  66.   
  67.     /** 
  68.      * 在每一个Fragment列表中展示的数据。 
  69.      */  
  70.     private ArrayList<String> getData() {  
  71.         for (int i = 0; i < 20; i++) {  
  72.             list.add("nihao" + i);  
  73.         }  
  74.         return list;  
  75.     }  
  76.   
  77.     @Override  
  78.     public void onListItemClick(ListView l, View v, int position, long id) {  
  79.         Toast.makeText(getActivity(), "您点击了"+position, 0).show();  
  80.     }  
  81.   
  82. }  
0 0