android的Viewpager 的各種經常的用法,朋友問我要過,所以就稍微總結一下,
ViewPager + Fragment 經常用到 代碼是從 actionbarsherlock 中提取出來的,這個效果都知道是 滑動來切換的。直接上代碼了
在這里簡單說明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter
2個adapter
第一種 fragment狀態adapter - 在當前只會存在 前1個fragment 當前 fragment 和 下1個 fragment 其他銷毀 ,適合加載多數據
第二種 FragmentPagerAdapter - 全部存在,所以不太適合加載 大量的數據 如圖片什么的,很容易內存溢出。
工程結構:
1. activity adapter 在一起 (static類型的 Fragment)
- public class ViewPageFragment extends FragmentActivity {
- //這個是有多少個 fragment頁面
- static final int NUM_ITEMS = 5;
- private MyAdapter mAdapter;
- private ViewPager mPager;
- private int nowPage;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pagers_fragment_main);
- mAdapter = new MyAdapter(getSupportFragmentManager() );
- mPager = (ViewPager)findViewById(R.id.mypagers_pager);
- mPager.setAdapter(mAdapter);
- }
- /**
- * 有狀態的 ,只會有前3個存在 其他銷毀, 前1個, 中間, 下一個
- */
- public static class MyAdapter extends FragmentStatePagerAdapter {
- public MyAdapter(FragmentManager fm) {
- super(fm);
- }
- @Override
- public int getCount() {
- return NUM_ITEMS;
- }
- //得到每個item
- @Override
- public Fragment getItem(int position) {
- return ArrayFragment.newInstance(position);
- }
- // 初始化每個頁卡選項
- @Override
- public Object instantiateItem(ViewGroup arg0, int arg1) {
- // TODO Auto-generated method stub
- return super.instantiateItem(arg0, arg1);
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- System.out.println( "position Destory" + position);
- super.destroyItem(container, position, object);
- }
- }
- /**
- * 無狀態的 會全部加載着, 這個適合少量的 特別多的圖片啊啥的 還是用 FragmentStatePagerAdapter
- * @author lilei
- */
- // public static class MyAdapter extends FragmentPagerAdapter {
- // public MyAdapter(FragmentManager fm ) {
- // super(fm);
- //
- // }
- //
- // @Override
- // public int getCount() {
- // return NUM_ITEMS;
- // }
- //
- // @Override
- // public Fragment getItem(int position) {
- // // 返回相應的 fragment
- // return ArrayFragment.newInstance(position);
- // }
- //
- // @Override
- // public void destroyItem(ViewGroup container, int position, Object object) {
- // System.out.println( "position Destory" + position);
- // super.destroyItem(container, position, object);
- // }
- // }
- /**
- * 所有的 每個Fragment
- */
- public static class ArrayFragment extends Fragment {
- int mNum;
- static ArrayFragment newInstance(int num) {
- ArrayFragment array= new ArrayFragment();
- Bundle args = new Bundle();
- args.putInt("num", num);
- array.setArguments(args);
- return array;
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mNum = getArguments() != null ? getArguments().getInt("num") : 1;
- System.out.println("mNum Fragment create ="+ mNum);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- System.out.println("onCreateView = ");
- //在這里加載每個 fragment的顯示的 View
- View v = null;
- if(mNum == 0){
- v = inflater.inflate(R.layout.pagers_fragment1, container, false);
- ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
- }else if(mNum == 1){
- v = inflater.inflate(R.layout.pagers_fragment1, container, false);
- ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
- }else if(mNum == 2){
- v = inflater.inflate(R.layout.pagers_fragment1, container, false);
- ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
- }else{
- v = inflater.inflate(R.layout.pagers_fragment1, container, false);
- ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
- }
- return v;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- System.out.println("onActivityCreated = ");
- super.onActivityCreated(savedInstanceState);
- }
- @Override
- public void onDestroyView(){
- System.out.println(mNum + "mNumDestory");
- super.onDestroyView();
- }
- @Override
- public void onDestroy(){
- super.onDestroy();
- }
- }
- }
2. 和 1也沒什么太大區別( 個中用處 看個人了 )
- public class ViewPageFragmentCS extends FragmentActivity {
- //這個是有多少個 fragment頁面
- private MyAdapter mAdapter;
- private ViewPager mPager;
- private List<Entity> list = new ArrayList<ViewPageFragmentCS.Entity>();;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pagers_fragment_main);
- for (int i = 0; i < 7 ; i++) {
- Entity ee = new Entity();
- ee.name = "ll"+ i;
- ee.age = ""+ i;
- list.add(ee);
- }
- mAdapter = new MyAdapter(getSupportFragmentManager(),list);
- mPager = (ViewPager)findViewById(R.id.mypagers_pager);
- mPager.setAdapter(mAdapter);
- }
- private class Entity{
- public String name;
- public String age;
- }
- // 在這里你可以傳 list<Fragment> 也可以傳遞 list<Object>數據
- public class MyAdapter extends FragmentStatePagerAdapter {
- List<Entity> list_ee;
- public MyAdapter(FragmentManager fm, List<Entity> ee) {
- super(fm);
- this.list_ee = ee ;
- }
- @Override
- public int getCount() {
- return list_ee.size();
- }
- // 初始化每個頁卡選項
- @Override
- public Object instantiateItem(ViewGroup arg0, int position) {
- ArrayFragment ff = (ArrayFragment)super.instantiateItem(arg0, position);
- ff.setThings(list_ee.get(position),position);
- return ff;
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- System.out.println( "position Destory" + position);
- super.destroyItem(container, position, object);
- }
- @Override
- public Fragment getItem(int arg0) {
- // TODO Auto-generated method stub
- return new ArrayFragment();
- }
- }
- /**
- * 所有的 每個Fragment
- */
- public class ArrayFragment extends Fragment {
- private Entity ee;
- private int position;
- public void setThings(Entity ee,int position){
- this.ee =ee ;
- this.position = position;
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- System.out.println("onCreateView = ");
- //在這里加載每個 fragment的顯示的 View
- View v = inflater.inflate(R.layout.pagers_fragment1, container, false);
- ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);
- return v;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- System.out.println("onActivityCreated = ");
- super.onActivityCreated(savedInstanceState);
- }
- @Override
- public void onDestroyView(){
- System.out.println("onDestroyView = "+ position);
- super.onDestroyView();
- }
- @Override
- public void onDestroy(){
- System.out.println("onDestroy = "+ position);
- super.onDestroy();
- }
- }
- }
直接復制過去就可以看效果了 別忘記 V4包,xml 布局文件 自己隨便整個吧。
滑動到第3個頁面的時候可以看到 第1個頁面銷毀 第4個生成, 當前存在 2 3 4