前面学习了ViewPager的简单应用,但是那是简单的直接加载View,但是实际的情况更多会采用fragment的方式。
这一章就来学习一下ViewPager加载Fragment。
首页看一下结构目录
这里layout跟第一章的跟前面的基本一样,只是每个View对应了一个fragment。
package com.example.lolli.viewpager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by lolli on 2016/3/19.
*/
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.view1, container, false);
}
}
现在主要看看关于Activity的处理:
package com.example.lolli.viewpager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* 因为要获取FragmentAdapterManager,这里我们必须继承FragmentActivity
*/
public class MainActivity extends FragmentActivity {
// 定义控件
private ViewPager viewPager;
// 定义fragment集合
private List<Fragment> fragmentList;
// 定义标题集合
private List<String> titleList;
// 定义一个FragmentAdapter
private MyFragmentAdapter myFragmentAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
viewPager = (ViewPager) findViewById(R.id.viewPager);
// 初始化fragment数据
fragmentList = new ArrayList<Fragment>();
fragmentList.add(new Fragment1());
fragmentList.add(new Fragment2());
fragmentList.add(new Fragment3());
fragmentList.add(new Fragment4());
// 初始化标题数据
titleList = new ArrayList<String>();
titleList.add("标题一");
titleList.add("标题二");
titleList.add("标题三");
titleList.add("标题四");
// 实例化一个FragmentAdapter
myFragmentAdapter = new MyFragmentAdapter(getSupportFragmentManager(), fragmentList, titleList);
// setAdapter
viewPager.setAdapter(myFragmentAdapter);
// 设置页面改变监听 》 这里是add , 不是set
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Toast.makeText(MainActivity.this, "当前第" + (position+1) + "页,共" + myFragmentAdapter.getCount() + "页", Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
这里发现我们用的不是PagerAdapter了 转用了FragmentPagerAdapter,我们再看看我们重写的这个FragmentPagerAdapter:
package com.example.lolli.viewpager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* Created by lolli on 2016/3/19.
*/
public class MyFragmentAdapter extends FragmentPagerAdapter{
// fragment集合
public List<Fragment> fragmentList;
// 标题
public List<String> titleList;
/**
* 有参构造
* @param fm
* @param fragmentList
* @param titleList
*/
public MyFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) {
super(fm);
this.fragmentList = fragmentList;
this.titleList = titleList;
}
/**
* 获取页卡
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
/**
* 获取页卡数量
* @return
*/
@Override
public int getCount() {
return fragmentList.size();
}
/**
* 获取页面标题
* @param position
* @return
*/
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
}
这里没有重写销毁的那个方法,他应该是一次性全部加载出了所有的fragment。
最后看看效果: