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() 等時候的內存釋放。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM