最近在實現一個像gmail 查看郵件時的滑動翻頁。遇到了很多問題,記錄一下並和大家分享。這里主要分享的是如何給 讓 viewpager 滑動更平滑,以及如何獲取 viewpager中當前頁的引用。
我這里使用的是最基本的PagerAdapter 當然也可以使用封裝更好的FragmentPagerAdapter
或 FragmentStatePagerAdapter。
PagerAdapter 的使用的使用最少實現下面四個方法
instantiateItem(ViewGroup, int)
destroyItem(ViewGroup, int, Object)
getCount()
isViewFromObject(View, Object)
詳細請見 api。
下面是我的adapter:
package com.trace.pagerviewdemo; import java.util.HashMap; import android.R.integer; import android.app.Activity; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; public class MyPagerAdapter extends PagerAdapter { private int size; private Activity context; private HashMap<Integer, View> viewMap = new HashMap<Integer, View>(); public MyPagerAdapter(Activity mContext,int mSize){ this.size = mSize; this.context = mContext; } @Override public void destroyItem(View arg0, int arg1, Object arg2){ ((ViewPager)arg0).removeView((View) arg2); viewMap.remove(arg1); } @Override public void finishUpdate(View arg0) { } @Override public int getCount() { return size; } @Override public Object instantiateItem(View arg0, int arg1) { LayoutInflater mInflater = context.getLayoutInflater(); View view1 = mInflater.inflate(R.layout.layout1, null); TextView text1 = (TextView) view1.findViewById(R.id.txt); text1.setText("t"+arg1); ((ViewPager) arg0).addView(view1); viewMap.put(arg1, view1); return view1; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == (arg1); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } public View getViewByPosition(int position) { return viewMap.get(position); } }
默認的情況下 pageradapter 為我們緩存一個屏幕外視圖,及當前的view 和即將展現的veiw 下圖是 debug 的截圖
我們可以看到當前視圖及viewpager 有兩個 子視圖。
當我們 修改一下 mPager.setOffscreenPageLimit(3); 這里設置的是 viewpager 屏幕外保存的 view 的個數,
這是當前視圖 及 viewpager 總共有 四個子視圖。通過設置OffscreenPageLimit 我們可以設置 緩存view 的個數,當緩存的view 的個數越多時,滑動翻頁將會更流暢,此時需要注意的是 緩存的視圖越多 特別是子視圖特別復雜的時候,將會帶來更大的內存消耗,所有 OffscreenPageLimit 的值不是越大越好。要同時考慮滑動的手感和內存兩種情況,取一個折中的值。至於內存釋放就要 重寫好 destroyItem(View arg0, int arg1, Object arg2) 這個方法,並管理好view onpose() 等時候的內存釋放。