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之后就正常了