android 翻页, Viewpager 的使用及优化
最近在实现一个像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() 等时候的内存释放。