本代码有缺陷,如果回到桌面后,资源被系统回收后会报错。
新文章: http://blog.csdn.net/q445697127/article/details/18352033
Activity继承FragmentActivity
1package com.bitcare.activity; 2 3import java.util.ArrayList; 4import java.util.List; 5 6import android.graphics.Matrix; 7import android.support.v4.app.FragmentActivity; 8import android.support.v4.view.ViewPager; 9import android.support.v4.view.ViewPager.OnPageChangeListener; 10import android.util.DisplayMetrics; 11import android.view.Display; 12import android.view.View; 13import android.view.ViewGroup.LayoutParams; 14import android.view.WindowManager; 15import android.view.animation.Animation; 16import android.view.animation.TranslateAnimation; 17import android.widget.ImageButton; 18import android.widget.ImageView; 19import android.widget.TextView; 20 21import com.bitcare.adapter.FmtPagerAdapter; 22import com.bitcareV2.activity.R; 23import com.googlecode.androidannotations.annotations.AfterViews; 24import com.googlecode.androidannotations.annotations.Click; 25import com.googlecode.androidannotations.annotations.EActivity; 26import com.googlecode.androidannotations.annotations.NoTitle; 27import com.googlecode.androidannotations.annotations.ViewById; 28 29@EActivity(R.layout.activity_hospital) 30public class HospitalActivity extends FragmentActivity { 31 32 @ViewById 33 TextView tvTitle; 34 @ViewById 35 TextView tvProfiles, tvOffice, tvEvaluate; 36 @ViewById 37 ImageButton ibLeft; 38 @ViewById 39 ImageView ivBottomLine; 40 @ViewById 41 ViewPager vpHospital; 42 43 private List<BaseFragment> fragments; 44 private int currIndex = 0; 45 private int bottomLineWidth; 46 private int offset = 0; 47 48 @AfterViews 49 void initView() { 50 tvTitle.setText("南昌大学第二附属医院"); 51 ibLeft.setVisibility(View.VISIBLE); 52 InitWidth(); 53 InitViewPager(); 54 } 55 56 private void InitWidth() { 57 int screenWidth;// 屏幕宽度 如果是使用图片可以使用另一篇文章的宽度计算方法 58 WindowManager windowManager = getWindowManager(); 59 Display display = windowManager.getDefaultDisplay(); 60 screenWidth = display.getWidth(); 61 62 bottomLineWidth = screenWidth / 3; 63 64 LayoutParams layoutParams = ivBottomLine.getLayoutParams(); 65 layoutParams.width = bottomLineWidth; 66 ivBottomLine.setLayoutParams(layoutParams); 67 68 DisplayMetrics dm = new DisplayMetrics(); 69 getWindowManager().getDefaultDisplay().getMetrics(dm); 70 int screenW = dm.widthPixels;// 获取分辨率宽度 71 offset = (screenW / 3 - bottomLineWidth) / 2;// 计算偏移量 72 73 Matrix matrix = new Matrix(); 74 matrix.postTranslate(offset, 0); 75 ivBottomLine.setImageMatrix(matrix);// 设置动画初始位置 76 77 } 78 79 private HospitalProfilesFragment_ profilesFragment_; 80 private HospitalOfficeFragment_ officeFragment_; 81 private HospitalEvaluateFragment_ evaluateFragment_; 82 83 private void InitViewPager() { 84 fragments = new ArrayList<BaseFragment>(); 85 86 profilesFragment_ = new HospitalProfilesFragment_(); 87 officeFragment_ = new HospitalOfficeFragment_(); 88 evaluateFragment_ = new HospitalEvaluateFragment_(); 89 90 fragments.add(profilesFragment_); 91 fragments.add(officeFragment_); 92 fragments.add(evaluateFragment_); 93 94 vpHospital.setAdapter(new FmtPagerAdapter(getSupportFragmentManager(), fragments)); 95 vpHospital.setOnPageChangeListener(changeListener); 96 tvProfiles.setTextColor(getResources().getColor(R.color.black_txt)); 97 } 98 99 @Click 100 void ibLeft() { 101 finish(); 102 } 103 104 @Click 105 void tvProfiles() { 106 vpHospital.setCurrentItem(0); 107 } 108 109 @Click 110 void tvOffice() { 111 vpHospital.setCurrentItem(1); 112 } 113 114 @Click 115 void tvEvaluate() { 116 vpHospital.setCurrentItem(2); 117 } 118 119 OnPageChangeListener changeListener = new OnPageChangeListener() { 120 @Override 121 public void onPageSelected(int arg0) { 122 int one = offset * 2 + bottomLineWidth;// 页卡1 -> 页卡2 偏移量 123 Animation animation = new TranslateAnimation(one * currIndex, one * arg0, 0, 0);// 显然这个比较简洁,只有一行代码。 124 currIndex = arg0; 125 animation.setFillAfter(true); 126 animation.setDuration(100); 127 ivBottomLine.startAnimation(animation); 128 129 tvProfiles.setTextColor(getResources().getColor(R.color.gray_txt)); 130 tvOffice.setTextColor(getResources().getColor(R.color.gray_txt)); 131 tvEvaluate.setTextColor(getResources().getColor(R.color.gray_txt)); 132 switch (arg0) { 133 case 0: 134 tvProfiles.setTextColor(getResources().getColor(R.color.black_txt)); 135 break; 136 case 1: 137 tvOffice.setTextColor(getResources().getColor(R.color.black_txt)); 138 break; 139 case 2: 140 tvEvaluate.setTextColor(getResources().getColor(R.color.black_txt)); 141 break; 142 } 143 } 144 145 @Override 146 public void onPageScrolled(int arg0, float arg1, int arg2) { 147 148 } 149 150 @Override 151 public void onPageScrollStateChanged(int arg0) { 152 } 153 }; 154}
为了做延迟加载数据需要自定义一个BaseFragment类
1package com.bitcare.activity; 2 3import android.support.v4.app.Fragment; 4 5public abstract class BaseFragment extends Fragment { 6 7 /** 8 * 显示页面数据 9 */ 10 public abstract void show(); 11}
在写一个FragmentPagerAdapter类
1package com.bitcare.adapter; 2 3import java.util.List; 4 5import android.support.v4.app.Fragment; 6import android.support.v4.app.FragmentManager; 7import android.support.v4.app.FragmentPagerAdapter; 8import android.view.ViewGroup; 9 10import com.bitcare.activity.BaseFragment; 11 12public class FmtPagerAdapter extends FragmentPagerAdapter { 13 private List<BaseFragment> fragmentsList; 14 private FragmentManager fm; 15 public FmtPagerAdapter(FragmentManager fm) { 16 super(fm); 17 this.fm = fm; 18 } 19 20 public FmtPagerAdapter(FragmentManager fm, List<BaseFragment> fragments) { 21 super(fm); 22 this.fragmentsList = fragments; 23 this.fm = fm; 24 } 25 26 @Override 27 public int getCount() { 28 return fragmentsList.size(); 29 } 30 31 @Override 32 public Fragment getItem(int arg0) { 33 return fragmentsList.get(arg0); 34 } 35 @Override 36 public void setPrimaryItem(ViewGroup container, int position, Object object) { 37 //知道当前是第几页,但是每次滑动后可能会调用多次 38 //这个方法是重点 39 super.setPrimaryItem(container, position, object); 40 fragmentsList.get(position).show(); 41 } 42 @Override 43 public int getItemPosition(Object object) { 44 //加此方法可以使viewpager可以进行刷新 45 return PagerAdapter.POSITION_NONE; 46 } 47 //使用此方法刷新数据 每次都要NEW一个新的List,不然没有刷新效果 转至http://blog.sina.com.cn/s/blog_783ede03010173b4.html 48 public void setFragments(ArrayList<Fragment> fragments) { 49 if(this.fragments != null){ 50 FragmentTransaction ft = fm.beginTransaction(); 51 for(Fragment f:this.fragments){ 52 ft.remove(f); 53 } 54 ft.commit(); 55 ft=null; 56 fm.executePendingTransactions(); 57 } 58 this.fragments = fragments; 59 notifyDataSetChanged(); 60 } 61 @Override 62 public void destroyItem(ViewGroup container, int position, Object object) { 63 // 注释自带的销毁方法防止页面被销毁 64 //这个方法是重点 65 // super.destroyItem(container, position, object);} 66}
给每个单独的页面继承BaseFragment即可,在show方法中实现调用数据的方法,但是注意的是每次滑动会多次调用show方法
版权声明:本文为博主原创文章,未经博主允许不得转载。