天天看点

ViewPager、ViewPager和Fragment组合使用的基本用法

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

继续阅读