ViewPager介绍
ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view。
从这个描述中我们知道几点:
1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。
2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
在编写ViewPager的应用的使用,还需要使用两个组件类分别是PagerTitleStrip类和PagerTabStrip类,PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。
layout.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/tabstrip"
android:layout_width="wrap_content"
android:layout_height="50dip"
android:gravity="center" />
</android.support.v4.view.ViewPager>
</RelativeLayout>
View的加载
我们先写ViewPager的适配器:
MyPagerAdapter.java
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class MyPagerAdapter extends PagerAdapter{
private List<View> viewList;
public MyPagerAdapter(List<View> viewList){
this.viewList = viewList;
}
/**
* 返回页卡的数量
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
/**
* 页卡是否来自于对象
*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
/**
* 实例化一个页卡
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(viewList.get(position));
return viewList.get(position);
// return super.instantiateItem(container, position);
}
/**
* 销毁一个页卡
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
// super.destroyItem(container, position, object);
}
/**
* 返回页面标题信息
*/
// @Override
// public CharSequence getPageTitle(int position) {
// // TODO Auto-generated method stub
// return viewTitle.get(position);
// }
}
然后写主函数,这里省略了xml中的代码。
VPagerActivity.java
import java.util.ArrayList;
import java.util.List;
import com.hch.svpre.R;
import com.hch.svpre.adapter.MyPagerAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.View;
public class VPagerActivity extends Activity {
private ViewPager viewPager;
private List<View> listView;
private MyPagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_viewpager);
initData();
initView();
}
private void initData() {
// TODO Auto-generated method stub
listView = new ArrayList<View>();
View view1 = View.inflate(this, R.layout.viewpager1, null);
View view2 = View.inflate(this, R.layout.viewpager2, null);
View view3 = View.inflate(this, R.layout.viewpager3, null);
View view4 = View.inflate(this, R.layout.viewpager4, null);
listView.add(view1);
listView.add(view2);
listView.add(view3);
listView.add(view4);
}
private void initView() {
// TODO Auto-generated method stub
viewPager = (ViewPager) this.findViewById(R.id.vpView);
pagerAdapter = new MyPagerAdapter(listView);
viewPager.setAdapter(pagerAdapter);
// 滑动监听器
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
}
与Fragment“合作”
简单点儿说,这里只需要把上面的View数组改为Fragment数组即可,但这里需要注意几个方面:
1)主函数继承FragmentActivity,而不是Activity。
2)Fragment要使用v4的包,也就是android.support.v4.app.Fragment。
下面为示例代码:
VPFragActivity.java
import java.util.ArrayList;
import java.util.List;
import com.hch.svpre.R;
import com.hch.svpre.activity.fragment.VPFragment1;
import com.hch.svpre.activity.fragment.VPFragment2;
import com.hch.svpre.activity.fragment.VPFragment3;
import com.hch.svpre.activity.fragment.VPFragment4;
import com.hch.svpre.adapter.MyFragmentPagerAdapter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class VPFragActivity extends FragmentActivity{
private ViewPager viewPager;
private List<Fragment> listFragment;
private MyFragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_viewpager);
initData();
initView();
}
private void initData() {
// TODO Auto-generated method stub
listFragment = new ArrayList<Fragment>();
listFragment.add(new VPFragment1());
listFragment.add(new VPFragment2());
listFragment.add(new VPFragment3());
listFragment.add(new VPFragment4());
}
private void initView() {
// TODO Auto-generated method stub
viewPager = (ViewPager) this.findViewById(R.id.vpView);
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), listFragment);
viewPager.setAdapter(adapter);
}
}
MyPagerAdapter.java
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
private List<Fragment> listFragment;
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> listFragment) {
super(fm);
// TODO Auto-generated constructor stub
this.listFragment = listFragment;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return listFragment.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listFragment.size();
}
}
Fragment函数
import com.hch.svpre.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class VPFragment1 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.viewpager1, container, false);
return view;
}
}
这里只写出一个Fragment函数,应写4个就可以,这里只是举个例子。
FrgmentPagerAdapter与FragmentStatePaterAdapter的区别;
使用FragmentPagerAdapter适配器不会运行Fragment函数中onDestroy()的方法,就是不会销毁,而后者会销毁。
注意:ViewPager中存在缓存机制,当你在第二页时,它会缓存第一和第三页,而第四页和其他页会自动销毁。