android 翻页, Viewpager 的使用及优化

  最近在实现一个像gmail 查看邮件时的滑动翻页。遇到了很多问题,记录一下并和大家分享。这里主要分享的是如何给 让 viewpager 滑动更平滑,以及如何获取 viewpager中当前页的引用。

  我这里使用的是最基本的PagerAdapter 当然也可以使用封装更好的FragmentPagerAdapter FragmentStatePagerAdapter。PagerAdapter 的使用的使用最少实现下面四个方法

详细请见 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() 等时候的内存释放。

 

posted on 2013-01-13 20:43  Trace_Li  阅读(8314)  评论(1编辑  收藏  举报

导航