初識ViewPager

什么是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
destroyItem.png

該方法實現的功能是移除一個給定位置的頁面。適配器有責任從容器中刪除這個視圖。這是為了確保在finishUpdate(viewGroup)返回時視圖能夠被移除。

  • instantiateItem
Paste_Image.png

這個函數的實現的功能是創建指定位置的頁面視圖。適配器有責任增加即將創建的View視圖到這里給定的container中,這是為了確保在finishUpdate(viewGroup)返回時,視圖已經被添加。
返回值:返回一個代表新增視圖頁面的Object(Key),這里沒必要非要返回視圖本身,也可以這個頁面的其它容器。也可以是position變量也可以做為Key。

  • isViewFromObject
Paste_Image.png

該函數用來判斷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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容