先介紹下父類PagerAdapter,包含主要方法 instantiateItem初始化每一個頁面的view,這個用的比較少html
viewPager = (ViewPager) findViewById(R.id.viewpager); LayoutInflater inflater=getLayoutInflater(); view1 = inflater.inflate(R.layout.layout1, null); view2 = inflater.inflate(R.layout.layout2,null); view3 = inflater.inflate(R.layout.layout3, null); viewList = new ArrayList<View>();// 將要分頁顯示的View裝入數組中 viewList.add(view1); viewList.add(view2); viewList.add(view3); PagerAdapter pagerAdapter = new PagerAdapter() { @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getCount() { return viewList.size(); //界面總的個數 } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); //移除view } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(viewList.get(position)); return viewList.get(position); } }; viewPager.setAdapter(pagerAdapter);
List<Fragment> fragments=new ArrayList<Fragment>(); fragments.add(new Fragment1()); //不一樣佈局的 fragments.add(new Fragment2()); FragAdapter adapter = new FragAdapter(getSupportFragmentManager(), fragments); ViewPager vp = (ViewPager)findViewById(R.id.viewpager); vp.setAdapter(adapter); public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 佈局初始化 數據加載之類的操做 View view=inflater.inflate(R.layout.layout2, container, false); return view; } } public class FragAdapter extends FragmentPagerAdapter { private List<Fragment> mFragments; public FragAdapter(FragmentManager fm,List<Fragment> fragments) { super(fm); // TODO Auto-generated constructor stub mFragments=fragments; } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return mFragments.get(arg0); } @Override public int getCount() { // TODO Auto-generated method stub return mFragments.size(); } }
ArrayList<Fragment> fragmentList = new ArrayList<Fragment>(); for (int i = 0; i < 280; i++) { MainFragment first = new MainFragment(); fragmentList.add(first); //佈局同樣數據不同的界面 } wikiAdapter = new MyFrageStatePagerAdapter(getSupportFragmentManager()); wikipediaPager.setAdapter(wikiAdapter); public class MyFrageStatePagerAdapter extends FragmentStatePagerAdapter { public MyFrageStatePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return MainFragment.newInstance(position); //爲了傳遞當前界面index便於進行初始化 } @Override public int getCount() { return fragmentList.size(); //總的界面數 } } //自定義得到界面及傳入當前界面的值,初始化界面 public class MainFragment extends Fragment { private int mNum; public static MainFragment newInstance(int num) { MainFragment f = new MainFragment(); Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; } View view; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { // TODO Auto-generated method stub view = inflater.inflate(R.layout.wikipedia_pager_item, container,false); initView(view,MainActivity.wikiList.get(mNum)); return view; } }
FragmentPagerAdapter 繼承自 PagerAdapter。相比通用的 PagerAdapter,該類更專一於每一頁均爲 Fragment 的狀況。如文檔所述,該類內的每個生成的 Fragment 都將保存在內存之中,所以適用於那些相對靜態的頁,數量也比較少的那種;java
如需要處理不少頁,數據動態性較大,佔用內存多的狀況,使用FragmentStatePagerAdapter。android
固然PagerAdapter也能夠處理不少頁面的,用循環隊列來節省內存,例子以下web
viewpager老是會預加載後面的界面,因此要讓控件自己去找到對於的view和數據 date.index讓對應view加載對應數據json
package cn.new1.cloudnurse.pregnancy.main.adapter; public class WikipediaPagerAdapter extends PagerAdapter{ //佈局的view private List<ScrollView> contentViewList = new LinkedList<ScrollView>(); private int pagerCount; //循環的個數 Context context; public WikipediaPagerAdapter(Context context, int pagerCount) { this.context = context; this.pagerCount = pagerCount;// * 2; for (int i = 0; i < pagerCount; i++) { ScrollView scrollView = (ScrollView) View.inflate(context, R.layout.wikipedia_pager_item, null); contentViewList.add(scrollView); } } WikiPediaData date; @Override public void draw(int arg0, Object arg1) { // WikiPediaData date; try { JSONObject jsonObject = new JSONObject((String)arg1); date = new WikiPediaData(); date.date = jsonObject.optString("currentDate"); date.babychange = jsonObject.optString("v_baby_changes"); date.momchange = jsonObject.optString("v_mom_changes"); showView(date); } catch (JSONException e) { e.printStackTrace(); } } private void showView(final WikiPediaData date){ //獲取對應數據的view而後加載數據顯示 ScrollView scrollView = contentViewList.get(date.index%pagerCount); dateTv = (TextView) scrollView.findViewById(R.id.wikipedia_date); babyChangeTv = FindView.byId(scrollView, R.id.wikipedia_baby_change); }); dateTv.setText(date.date); babyChangeTv.setText(date.babychange); } @Override public int getCount() { return PregnancyParam.GESTATIONAL_DAY_COUNT; //無數個確保viewpager的數量能夠一直累計 } @Override public boolean isViewFromObject(View view, Object obj) { return view == obj; } private TextView dateTv; //日期 private TextView babyChangeTv; //寶貝變化 public static int indexCurrent = 0; @Override public Object instantiateItem(View view, int index) { //要初始化的view ViewGroup parent = (ViewGroup) contentViewList.get(index%pagerCount).getParent(); WikiPediaDb db = new WikiPediaDb(context); WikiPediaData tmpData = db.getContactList(index+""); if (parent != null) { //循環隊列加載 部份內存會相同 最好確保不能相鄰 viewpager內存實時緩存3個界面 } else { ((ViewPager) view).addView(contentViewList.get(index%pagerCount),0); } indexCurrent = index%pagerCount; return contentViewList.get(index%pagerCount); } @Override public void destroyItem(View view, int index, Object obj) { ((ViewPager) view).removeView(contentViewList.get(index%pagerCount)); //移除view } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return POSITION_UNCHANGED; } }綜合多頁面數據變化大的推薦使用FragmentStatePagerAdapter