ViewPager是一個在android-support-v4才有的元件

他的用途是達成像ios中

用手指左右滑動就可以換頁的效果

 

他是利用類似Fragment達成的外觀

能夠做到主要畫面不變

只有ViewPager包含的元件做更動

xml檔中包含的ViewPager長的像這樣

(當然也可以從code addView() )

<android.support.v4.view.ViewPager
  android:id="@+id/fridgeItemType"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_above="@+id/fridgeCombos"
  android:layout_alignParentLeft="true"
  android:layout_below="@+id/indicator" >
</android.support.v4.view.ViewPager>

 

ViewPager和其他多選畫面類似

都需要一個Adapter來做中介

(adapter:改編者、改寫者)

ViewPager所使用的元件是PageAdapter (android.support.v4.view.PagerAdapter)

PageAdapter並非抽像類別

可以直接使用

但是通常為了達到所需的要求

重新定義其中的function

範例如下:

package tw.combos;

import java.util.List;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;

public class CombosPagerAdapter extends PagerAdapter{
	private static final String[] TITLES = new String[] {"肉類","蔬菜", "其他"};
        private List mListViews;
	
	CombosPagerAdapter(List mListViews){
			this.mListViews = mListViews;
	}
	
	@Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position % TITLES.length];
    }
	
	@Override
	public void destroyItem(View arg0, int arg1, Object arg2) {
		((ViewPager) arg0).removeView(mListViews.get(arg1));
	}

	@Override
	public void finishUpdate(View arg0) {
		
	}

	@Override
	public int getCount() {
		return mListViews.size();
	}

	@Override
	public Object instantiateItem(View arg0, int arg1) {
		((ViewPager) arg0).addView(mListViews.get(arg1),0);
		return mListViews.get(arg1);
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0==(arg1);
	}

	@Override
	public void restoreState(Parcelable arg0, ClassLoader arg1) {
		Log.d("k", "restoreState");
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	@Override
	public void startUpdate(View arg0) {
		
	}  	
	
	@Override
	public int getItemPosition(Object object) {
	    return POSITION_NONE;
	}
	
}

mListViews是一個List物件
裡面所存的object是View
也就是每個一頁要顯示的畫面

CharSequence getPageTitle(int position)
可以設定每一頁上面的標題

void destroyItem(View arg0, int arg1, Object arg2)
如果app將刪除某一頁
則呼叫此method
以下所有出現的arg0
皆這個adapter被哪個ViewPager擁有 

int getCount()
將回傳ViewPager包含的頁數
(也就是可以左右滑動幾次)

Object instantiateItem(View arg0, int arg1)
ViewPager呼叫此method
將mListViews中的畫面
顯示再ViewPager上 


int getItemPosition(Object object)
回傳POSITION_NONE
原因可以參考這篇
http://shareandopen.tumblr.com/post/27020093694/android-update-the-view-content-in-view-pager 

 

剩下的就很簡單了
跟Spinner或是ListView相似
先setAdaper()和setOnPageChangeListener()
接著重新寫過OnPageChangeListener的動作
如下: 

myViewPager.setAdapter(myAdapter);
myViewPager.setCurrentItem(1); 
myViewPager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
	public void onPageSelected(int arg0) {
		View v = mListViews.get(arg0);
		switch(arg0){
			case 0:
				//title.setText("MEAT");
				mIndicator.setViewPager(myViewPager, 0);
				break;
			case 1:
				//title.setText("VEGETABLE");
				mIndicator.setViewPager(myViewPager, 1);
				break;
			case 2:
				//title.setText("VEGETABLE");
				mIndicator.setViewPager(myViewPager, 2);
				break;
		}
	}			
	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
	}
			
	@Override
	public void onPageScrollStateChanged(int arg0) {
		//mIndicator.setCurrentItem(myAdapter.getCount()-1);
	}
});
創作者介紹
創作者 Klv 的頭像
Klv

值得嗎?

Klv 發表在 痞客邦 留言(0) 人氣()