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

来源:互联网 发布:mac图片怎么保存 编辑:程序博客网 时间:2024/05/22 11:51

安卓中使用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;@Overrideprotected 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() {@Overridepublic 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 stubLog.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 stubreturn title.get(position);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();//表示有多少个界面被加载}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;//判断两个是否为同一对象}}



0 0
原创粉丝点击