什么是ViewPager
ViewPager:實現兩個完整畫面之間的轉換
基本用法
1.在布局文件中加入ViewPager組件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<android.support.v4.view.PagerTitleStrip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager>
</LinearLayout>
其中 <android.support.v4.view.ViewPager /> 是ViewPager對應的組件。
2.創建三個布局文件視圖,用于ViewPager切換
這里我打算設計一個weatherDemo,于是需要三個視圖:chooseWeather、localWeather、setWeather。
choose_weather.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ffffff">
</LinearLayout>
local_weather.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ff00ff">
</LinearLayout>
set_weather.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ffff00">
</LinearLayout>
3.ViewPagerDemo.java
public class ViewPagerDemo extends Activity {
private View chooseWeather, localWeather, setWeather;
private ViewPager viewPager;
private List<View> viewList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager_demo);
viewPager = (ViewPager) findViewById(R.id.viewpager);
//初始化view,解析布局文件
LayoutInflater inflater = getLayoutInflater();
chooseWeather = inflater.inflate(R.layout.choose_weather, null);
localWeather = inflater.inflate(R.layout.local_weather, null);
setWeather = inflater.inflate(R.layout.set_weather, null);
viewList = new ArrayList<View>();
viewList.add(chooseWeather);
viewList.add(localWeather);
viewList.add(setWeather);
final PagerAdapter pagerAdapter = new PagerAdapter() {
/**
* 返回要滑動的view的個數
* @return
*/
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
/**
* 從當前container中刪除指定位置(position)的View;
* @param container
* @param position
* @param object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
/**
* 做了兩件事,第一:將當前視圖添加到container中,第二:返回當前View
* @param container
* @param position
* @return
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
//LogUtil.d("inposition", position + "");
return viewList.get(position);
}
};
viewPager.setAdapter(pagerAdapter);
}
** PagerAdapter適配器 **
PagerAdapter必須重寫以下四個函數:
- boolean isViewFromObject(View arg0, Object arg1)
- int getCount()
- void destroyItem(ViewGroup container, int position,Object object)
- Object instantiateItem(ViewGroup container, int position)
ViewPager適配器:PagerAdapter
官方文檔
重點:viewpager不直接處理每一個視圖而是將各個視圖與一個鍵聯系起來。這個鍵用來跟蹤且唯一代表一個頁面,不僅如此,該鍵還獨立于這個頁面所在adapter的位置。當pageradapter將要改變的時候他會調用startUpdate函數,接下來會調用一次或多次的instantiateItem或者destroyItem。最后在更新的后期會調用finishUpdate。當finishUpdate返回時 instantiateItem返回的對象應該添加到父ViewGroup destroyItem返回的對象應該被ViewGroup刪除。方法isViewFromObject(View, Object)代表了當前的頁面是否與給定的鍵相關聯。
對于非常簡單的pageradapter或許你可以選擇用page本身作為鍵,在創建并且添加到viewgroup后instantiateItem方法里返回該page本身即可destroyItem將會將該page從viewgroup里面移除。isViewFromObject方法里面直接可以返回view == object。
與每一個滑動View對應的Key是什么?
-
getCount
getCount().png
返回可用的View
- destroyItem
該方法實現的功能是移除一個給定位置的頁面。適配器有責任從容器中刪除這個視圖。這是為了確保在finishUpdate(viewGroup)返回時視圖能夠被移除。
- instantiateItem
這個函數的實現的功能是創建指定位置的頁面視圖。適配器有責任增加即將創建的View視圖到這里給定的container中,這是為了確保在finishUpdate(viewGroup)返回時,視圖已經被添加。
返回值:返回一個代表新增視圖頁面的Object(Key),這里沒必要非要返回視圖本身,也可以這個頁面的其它容器。也可以是position變量也可以做為Key。
- isViewFromObject
該函數用來判斷instantiateItem(ViewGroup, int)函數所返回來的Key與一個頁面視圖是否是代表的同一個視圖(即它倆是否是一對鍵值對)
返回值:如果對應的是同一個View,返回True,否則返回False。
自定義Key
public class ViewPagerDemo extends Activity {
private View chooseWeather, localWeather, setWeather;
private ViewPager viewPager;
private PagerTitleStrip pagerTitleStrip; //viewPager 標題
private PagerTabStrip pagerTabStrip;//viewpager 的指示器,效果:一條橫的粗的下劃線
private List<View> viewList;
private List<String> titleStringList;//標題內容列表
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager_demo);
viewPager = (ViewPager) findViewById(R.id.viewpager);
LayoutInflater inflater = getLayoutInflater();
chooseWeather = inflater.inflate(R.layout.choose_weather, null);
localWeather = inflater.inflate(R.layout.local_weather, null);
setWeather = inflater.inflate(R.layout.set_weather, null);
viewList = new ArrayList<View>();
viewList.add(chooseWeather);
viewList.add(localWeather);
viewList.add(setWeather);
PagerAdapter pagerAdapter = new PagerAdapter() {
/**
* 返回要滑動的view的個數
* @return
*/
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
int position = Integer.parseInt(arg1.toString())
LogUtil.d("isposition", position.intValue() + "");
return view == viewList.get(position);
}
/**
* 從當前container中刪除指定位置(position)的View;
* @param container
* @param position
* @param object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
/**
* 做了兩件事,第一:將當前視圖添加到container中,第二:返回當前View
* @param container
* @param position
* @return
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
LogUtil.d("inposition", position + "");
return position;
}
/*@Override
public CharSequence getPageTitle(int position) { return titleStringList.get(position);
}*/
};
viewPager.setAdapter(pagerAdapter);
}
}
這個代碼中我們實現instantiateItem方法,并且返回position作為創建指定position的View的key。在isViewFromObject方法中,我們需要判斷從instantiateItem返回的position(即isViewFromObject方法參數列表中的object)對應的view是否與isViewFromObject方法參數中的view相同。
參考博客:http://blog.csdn.net/harvic880925/article/details/38453725