天天看點

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

繼續閱讀