android 中的 ViewPager+ Fragment

时间:2022-09-17 20:53:32

android的Viewpager 的各种经常的用法,朋友问我要过,所以就稍微总结一下,

ViewPager + Fragment 经常用到  代码是从   actionbarsherlock 中提取出来的,这个效果都知道是 滑动来切换的。直接上代码了

在这里简单说明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter

2个adapter

第一种 fragment状态adapter -  在当前只会存在   前1个fragment  当前 fragment 和 下1个 fragment   其他销毁 ,适合加载多数据

第二种 FragmentPagerAdapter  - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。

工程结构:

android 中的 ViewPager+ Fragment

1.    activity   adapter 在一起 (static类型的 Fragment)

  1. public class ViewPageFragment extends FragmentActivity {
  2. //这个是有多少个 fragment页面
  3. static final int NUM_ITEMS = 5;
  4. private MyAdapter    mAdapter;
  5. private ViewPager    mPager;
  6. private int  nowPage;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.pagers_fragment_main);
  11. mAdapter = new MyAdapter(getSupportFragmentManager() );
  12. mPager = (ViewPager)findViewById(R.id.mypagers_pager);
  13. mPager.setAdapter(mAdapter);
  14. }
  15. /**
  16. *  有状态的 ,只会有前3个存在 其他销毁,  前1个, 中间, 下一个
  17. */
  18. public static class MyAdapter extends   FragmentStatePagerAdapter {
  19. public MyAdapter(FragmentManager fm) {
  20. super(fm);
  21. }
  22. @Override
  23. public int getCount() {
  24. return NUM_ITEMS;
  25. }
  26. //得到每个item
  27. @Override
  28. public Fragment getItem(int position) {
  29. return ArrayFragment.newInstance(position);
  30. }
  31. // 初始化每个页卡选项
  32. @Override
  33. public Object instantiateItem(ViewGroup arg0, int arg1) {
  34. // TODO Auto-generated method stub
  35. return super.instantiateItem(arg0, arg1);
  36. }
  37. @Override
  38. public void destroyItem(ViewGroup container, int position, Object object) {
  39. System.out.println( "position Destory" + position);
  40. super.destroyItem(container, position, object);
  41. }
  42. }
  43. /**
  44. * 无状态的 会全部加载着, 这个适合少量的 特别多的图片啊啥的 还是用  FragmentStatePagerAdapter
  45. * @author lilei
  46. */
  47. //    public static class MyAdapter extends  FragmentPagerAdapter  {
  48. //      public MyAdapter(FragmentManager fm ) {
  49. //            super(fm);
  50. //
  51. //        }
  52. //
  53. //        @Override
  54. //        public int getCount() {
  55. //            return NUM_ITEMS;
  56. //        }
  57. //
  58. //        @Override
  59. //        public Fragment getItem(int position) {
  60. //          // 返回相应的  fragment
  61. //            return ArrayFragment.newInstance(position);
  62. //        }
  63. //
  64. //        @Override
  65. //        public void destroyItem(ViewGroup container, int position, Object object) {
  66. //          System.out.println( "position Destory" + position);
  67. //          super.destroyItem(container, position, object);
  68. //        }
  69. //    }
  70. /**
  71. * 所有的  每个Fragment
  72. */
  73. public static class ArrayFragment extends Fragment {
  74. int mNum;
  75. static ArrayFragment newInstance(int num) {
  76. ArrayFragment  array= new ArrayFragment();
  77. Bundle args = new Bundle();
  78. args.putInt("num", num);
  79. array.setArguments(args);
  80. return array;
  81. }
  82. @Override
  83. public void onCreate(Bundle savedInstanceState) {
  84. super.onCreate(savedInstanceState);
  85. mNum = getArguments() != null ? getArguments().getInt("num") : 1;
  86. System.out.println("mNum Fragment create ="+ mNum);
  87. }
  88. @Override
  89. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  90. Bundle savedInstanceState) {
  91. System.out.println("onCreateView = ");
  92. //在这里加载每个 fragment的显示的 View
  93. View v = null;
  94. if(mNum == 0){
  95. v = inflater.inflate(R.layout.pagers_fragment1, container, false);
  96. ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
  97. }else if(mNum == 1){
  98. v = inflater.inflate(R.layout.pagers_fragment1, container, false);
  99. ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
  100. }else  if(mNum == 2){
  101. v = inflater.inflate(R.layout.pagers_fragment1, container, false);
  102. ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
  103. }else{
  104. v = inflater.inflate(R.layout.pagers_fragment1, container, false);
  105. ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
  106. }
  107. return v;
  108. }
  109. @Override
  110. public void onActivityCreated(Bundle savedInstanceState) {
  111. System.out.println("onActivityCreated = ");
  112. super.onActivityCreated(savedInstanceState);
  113. }
  114. @Override
  115. public void onDestroyView(){
  116. System.out.println(mNum + "mNumDestory");
  117. super.onDestroyView();
  118. }
  119. @Override
  120. public void onDestroy(){
  121. super.onDestroy();
  122. }
  123. }
  124. }

2. 和 1也没什么太大区别( 个中用处 看个人了 )

  1. public class ViewPageFragmentCS extends FragmentActivity {
  2. //这个是有多少个 fragment页面
  3. private MyAdapter    mAdapter;
  4. private ViewPager    mPager;
  5. private List<Entity> list =  new ArrayList<ViewPageFragmentCS.Entity>();;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.pagers_fragment_main);
  10. for (int i = 0; i < 7 ; i++) {
  11. Entity ee = new Entity();
  12. ee.name = "ll"+ i;
  13. ee.age  = ""+ i;
  14. list.add(ee);
  15. }
  16. mAdapter = new MyAdapter(getSupportFragmentManager(),list);
  17. mPager = (ViewPager)findViewById(R.id.mypagers_pager);
  18. mPager.setAdapter(mAdapter);
  19. }
  20. private class Entity{
  21. public String name;
  22. public String age;
  23. }
  24. // 在这里你可以传 list<Fragment>  也可以传递  list<Object>数据
  25. public class MyAdapter extends FragmentStatePagerAdapter {
  26. List<Entity> list_ee;
  27. public MyAdapter(FragmentManager fm, List<Entity> ee) {
  28. super(fm);
  29. this.list_ee = ee ;
  30. }
  31. @Override
  32. public int getCount() {
  33. return list_ee.size();
  34. }
  35. // 初始化每个页卡选项
  36. @Override
  37. public Object instantiateItem(ViewGroup arg0, int position) {
  38. ArrayFragment ff  = (ArrayFragment)super.instantiateItem(arg0, position);
  39. ff.setThings(list_ee.get(position),position);
  40. return  ff;
  41. }
  42. @Override
  43. public void destroyItem(ViewGroup container, int position, Object object) {
  44. System.out.println( "position Destory" + position);
  45. super.destroyItem(container, position, object);
  46. }
  47. @Override
  48. public Fragment getItem(int arg0) {
  49. // TODO Auto-generated method stub
  50. return new ArrayFragment();
  51. }
  52. }
  53. /**
  54. * 所有的  每个Fragment
  55. */
  56. public  class ArrayFragment extends Fragment {
  57. private  Entity ee;
  58. private int position;
  59. public void setThings(Entity ee,int position){
  60. this.ee =ee ;
  61. this.position = position;
  62. }
  63. @Override
  64. public void onCreate(Bundle savedInstanceState) {
  65. super.onCreate(savedInstanceState);
  66. }
  67. @Override
  68. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  69. Bundle savedInstanceState) {
  70. System.out.println("onCreateView = ");
  71. //在这里加载每个 fragment的显示的 View
  72. View  v = inflater.inflate(R.layout.pagers_fragment1, container, false);
  73. ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);
  74. return v;
  75. }
  76. @Override
  77. public void onActivityCreated(Bundle savedInstanceState) {
  78. System.out.println("onActivityCreated = ");
  79. super.onActivityCreated(savedInstanceState);
  80. }
  81. @Override
  82. public void onDestroyView(){
  83. System.out.println("onDestroyView = "+ position);
  84. super.onDestroyView();
  85. }
  86. @Override
  87. public void onDestroy(){
  88. System.out.println("onDestroy = "+ position);
  89. super.onDestroy();
  90. }
  91. }
  92. }

直接复制过去就可以看效果了   别忘记  V4包,xml 布局文件 自己随便整个吧。

滑动到第3个页面的时候可以看到     第1个页面销毁   第4个生成,    当前存在   2  3   4

android 中的 ViewPager+ Fragment