前面學習了ViewPager的簡單應用,但是那是簡單的直接加載View,但是實際的情況更多會採用fragment的方式。
這一章就來學習一下ViewPager加載Fragment。
首頁看一下結構目錄
這裏layout跟第一章的跟前面的基本一樣,只是每個View對應了一個fragment。
package com.example.lolli.viewpager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by lolli on 2016/3/19.
*/
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.view1, container, false);
}
}
現在主要看看關於Activity的處理:
package com.example.lolli.viewpager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* 因爲要獲取FragmentAdapterManager,這裏我們必須繼承FragmentActivity
*/
public class MainActivity extends FragmentActivity {
// 定義控件
private ViewPager viewPager;
// 定義fragment集合
private List<Fragment> fragmentList;
// 定義標題集合
private List<String> titleList;
// 定義一個FragmentAdapter
private MyFragmentAdapter myFragmentAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
viewPager = (ViewPager) findViewById(R.id.viewPager);
// 初始化fragment數據
fragmentList = new ArrayList<Fragment>();
fragmentList.add(new Fragment1());
fragmentList.add(new Fragment2());
fragmentList.add(new Fragment3());
fragmentList.add(new Fragment4());
// 初始化標題數據
titleList = new ArrayList<String>();
titleList.add("標題一");
titleList.add("標題二");
titleList.add("標題三");
titleList.add("標題四");
// 實例化一個FragmentAdapter
myFragmentAdapter = new MyFragmentAdapter(getSupportFragmentManager(), fragmentList, titleList);
// setAdapter
viewPager.setAdapter(myFragmentAdapter);
// 設置頁面改變監聽 》 這裏是add , 不是set
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Toast.makeText(MainActivity.this, "當前第" + (position+1) + "頁,共" + myFragmentAdapter.getCount() + "頁", Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
這裏發現我們用的不是PagerAdapter了 轉用了FragmentPagerAdapter,我們再看看我們重寫的這個FragmentPagerAdapter:
package com.example.lolli.viewpager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* Created by lolli on 2016/3/19.
*/
public class MyFragmentAdapter extends FragmentPagerAdapter{
// fragment集合
public List<Fragment> fragmentList;
// 標題
public List<String> titleList;
/**
* 有參構造
* @param fm
* @param fragmentList
* @param titleList
*/
public MyFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) {
super(fm);
this.fragmentList = fragmentList;
this.titleList = titleList;
}
/**
* 獲取頁卡
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
/**
* 獲取頁卡數量
* @return
*/
@Override
public int getCount() {
return fragmentList.size();
}
/**
* 獲取頁面標題
* @param position
* @return
*/
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
}
這裏沒有重寫銷燬的那個方法,他應該是一次性全部加載出了所有的fragment。
最後看看效果: