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

来源:互联网 发布:网络方案的初步设计 编辑:程序博客网 时间:2024/05/22 07:56

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之后就正常了
0 0
原创粉丝点击