您的位置:首页 > 其它

安卓控件使用系列33:ViewPager多页面滑动控件的使用方法2

2015-10-03 22:56 387 查看
安卓中使用ViewPager实现多页面滑动的效果不是只有一种方法,下面将另一种方法分享给大家。

这个例子实现的是滑动页面不断出现新的相同的页面的效果。

整体思路:在xml文件中添加android.support.v4.view.ViewPager、android.support.v4.view.PagerTitleStrip,新建一个xml文件,里面放入任意控件;在活动中把新建的布局文件加载在原来的xml文件上,把这个布局文件放到一个动态数组中,把页面的标题以字符串的形式放入到另一个动态数组中,定义一个MyAdapter类继承PagerAdapter类,重写里面的方法,getCount方法用于返回布局的个数,destroyItem方法用于删除某个布局,getPageTitle方法用于得到某个页面的标题,instantiateItem方法用于初始化这个适配器,isViewFromObject用于判断两个对象是否相同,然后把这个MyAdapter类绑定到MyAdapter这个控件上。设置MyAdapter控件的setOnPageChangeListener这个事件,重写里面的方法,onPageSelected方法是在选择一个页面的时候触发的,onPageScrolled方法是页面开始滑动的时候触发的(不建议把加载网络数据的操作放在这里,因为这样会导致还没到达下一个页面的时候就开始加载网络数据,给程带来比较大的负担),onPageScrollStateChanged方法是页面已经滑动到下一个的时候触发的事件(把加载数据的操作放在这里比较合理),在这里添加并刷新适配器的数据,这几个方法都用Log的形式输出了不同的提示信息,用于开发人员观察各个方法的触发形式和使用方法。

activity_main.xml文件:

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pagertitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
>

</android.support.v4.view.PagerTitleStrip>
</android.support.v4.view.ViewPager>
tab.xml文件:

<!--
自定义一个布局,用来填充 ViewPager的显示页面,可以来自本地或者网络的数据
例如:图文混排的效果
-->
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


MainActivity.java文件:

private ViewPager viewPager;
private PagerTitleStrip pagerTitleStrip;
private MyAdapter adapter=null;
private List<View> list=null;
private List<String> title=null;
private LayoutInflater inflater=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager=(ViewPager)findViewById(R.id.viewpager);
pagerTitleStrip=(PagerTitleStrip)findViewById(R.id.pagertitle);
adapter=new MyAdapter();
//		加载布局
inflater=LayoutInflater.from(MainActivity.this);
//		第一次被加载的布局对象
View tab=inflater.inflate(R.layout.tab, null);

list=new ArrayList<View>();//加入到动态数组中
list.add(tab);

title=new ArrayList<String>();//加入到动态数组中
title.add("title");
//		先初始化页面
viewPager.setAdapter(adapter);//绑定适配器
//		选择发生变化的监听事件
viewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
Log.i("MainActivity", "arg0:"+arg0);
}

@Override//不建议在这个方法中加载网络数据,因为拉动不太大的距离时候会回到原来状态
//			这个方法的启动是在开始侧滑的时候,不一定滑动到下一个界面,只要开始滑动就会启动,所以不适合加载网路数据。
public void onPageScrolled(int a, float b, int c) {
// TODO Auto-generated method stub
Log.i("MainActivity","a:"+a);
Log.i("MainActivity","b:"+b);
Log.i("MainActivity","c:"+c);
Log.i("MainActivity","----------------");
}

@Override//在这个方法中完成界面的加载
public void onPageScrollStateChanged(int d) {
// TODO Auto-generated method stub
//				在这里开启线程去下载网络数据,来更新UI操作(这个方法的启动是在上一个界面完全退出,下一个界面完全进入的时候)

View view=inflater.inflate(R.layout.tab, null);
list.add(view);
title.add("new title");
//				刷新数据
adapter.notifyDataSetChanged();

Log.i("MainActivity", "d:"+d);
Log.i("MainActivity","----------------");
}
});

}

public class MyAdapter extends PagerAdapter{

@Override//初始化这个适配器
public Object instantiateItem(View container, int position) {
// TODO Auto-generated method stub
((ViewPager)container).addView(list.get(position));
return list.get(position);
}

@Override//销毁这个适配器
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
//super.destroyItem(container, position, object);
((ViewPager)container).removeView(list.get(position));
}

@Override//得到每个界面的标题
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return title.get(position);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();//表示有多少个界面被加载
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;//判断两个是否为同一对象
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: