安卓控件使用系列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文件:
MainActivity.java文件:
这个例子实现的是滑动页面不断出现新的相同的页面的效果。
整体思路:在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;//判断两个是否为同一对象 } }
相关文章推荐
- linux中文件属性和权限修改命令chgrp|chown|chmod介绍
- 百度搜索这些词:(百度搜索特效,好玩)
- 设计模式--命令模式(Command)
- mac上maven的配置
- 弱校联盟国庆第二天 D题
- [转载] 程序员如何成功追到女神?
- Tutorial: Using a URDF in Gazebo
- 从RTTI谈C++的向下转型
- 信息的表示和处理 第三周9.28~10.4
- 【特种兵PPT教程】如何给你的PPT2013文件加密?
- Gas Station - LeetCode 134
- IOS开发-属性动画和关键帧动画的使用
- 5、Hibernate的延迟加载
- mac上mysql配置-解决连接127.0.0.1错误问题
- jquery 实现邮箱输入自动提示功能:(一)
- 张氏web漏洞检查工具发布-英文名:Mr.Zhang Web Leak Scanner GUI
- 剑指offer—二叉树中和为某一值的路径
- linux配置网络办法
- python + opencv 学习系列 1 : Getting Started with Images
- Hive笔记六:数据导入