1.ViewPager
1)ViewPager類直接繼承了ViewGroup類,所有它是一個容器類,可以在其中添加其他的view類。
2)ViewPager類需要一個PagerAdapter擴充卡類給它提供資料。
3)ViewPager經常和Fragment一起使用,并且提供了專門的FragmentPagerAdapter和FragmentStatePagerAdapter類供Fragment中的ViewPager使用。
1.1 在Activity的布局中添加一個ViewPager的控件,這個控件是在v4包中的
<android.support.v4.view.ViewPager
android:id="@+id/view_pager_vp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
1.2 建立一個類MyPagerAdapter繼承PagerAdapter,重寫四種方法
List<View> list;
public MyPagerAdapter(List<View> list) {
this.list = list;
}
public int getCount() {
return list.size();
}
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
public Object instantiateItem(ViewGroup container, int position) {
View view = list.get(position);
container.addView(view);
return view;
}
public void destroyItem(ViewGroup container, int position, Object object) {
View view = list.get(position);
container.removeView(view);
}
1.3 在Activity中實作的操作
聲明屬性
List<View> list;
MyPagerAdapter adapter;
private ViewPager vp;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
執行個體化
vp = (ViewPager) findViewById(R.id.view_pager_vp);
添加資料
list = new ArrayList<>();
View view1 = LayoutInflater.from(this).inflate(R.layout.viewpager_1,null);
View view2 = LayoutInflater.from(this).inflate(R.layout.viewpager_2,null);
list.add(view1);
list.add(view2);
執行個體化Adapter,把資料源List通過Adapter的構造方法傳給adapter
adapter = new MyPagerAdapter(list);
将ViewPager和Adapter進行綁定
vp.setAdapter(adapter);
}
2.ViewPager+Fragment
2.1、建立一個類繼承FragmentPagerAdapter
/**
* fragmentPagerAdapter的擴充卡
* 主要用于fragment在viewpager中顯示的fragmentPagerAdapter是v4包的類
* 要實作其中的抽象方法和構造方法,
* 資料源list中的泛型是fragment的類型
*/
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
資料源
private List<Fragment> mList;
/**
* 構造方法
* @param fm fragment 管理器
* @param mList 資料源
*/
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> mList) {
super(fm);
this.mList = mList;
}
/**
* 得到目前的Item
*/
public Fragment getItem(int arg0) {
return mList.get(arg0);
}
/**
* 傳回Item的個數
*/
public int getCount() {
return mList.size();
}
}
2.2 建立一個類繼承Fragment
public class MyFragment extends Fragment {
private int resId;
/**
* 空參數的構造方法
*/
public MyFragment() {
}
/**
* 帶參數的構造方法
*/
public MyFragment(int resId) {
// TODO Auto-generated method stub
this.resId = resId;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.myfragment, null);
ImageView tv = (ImageView) view.findViewById(R.id.iv_fragment);
// 設定textView控件的内容為content
tv.setImageResource(resId);
return view;
}
}
2.3 在Activity中的代碼,Activity需要繼承FragmentActivity
public class FragmentViewpager extends FragmentActivity {
private ViewPager vp;
private List<FragmentPager> list;
private MyFragmentPagerAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_viewpager);
vp = (ViewPager) findViewById(R.id.fragment_pager_vp);
list = new ArrayList<>();
list.add(new FragmentPager());
list.add(new FragmentPager(R.mipmap.ic_launcher));
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),list);
vp.setAdapter(adapter);
}
}
可能出現的問題:
問題:在MainActivity中,當寫到這句:list.add(new FragmentPager(); 向Fragment清單中添加Fragement對象執行個體時,會提示“無法将FragmentPager()轉換為fragment”
解決辦法 :這是因為導入包不一緻,一般的問題在于:在Fragment1中導入的是android.app.Fragment, 而在這裡導入類确是:android.support.v4.app.Fragment,包不同當然無法轉換,統一導入為android.support.v4.app.Fragment之後就正常了