【Android 开发】:UI控件之 ViewPager 多页面滑动效果控件的的使用(二)
来源:互联网 发布:厦门安胜科技公司知乎 编辑:程序博客网 时间:2024/05/22 05:08
上一讲:【Android 开发】:UI控件之 ViewPager 多页面滑动效果控件的的使用 我们已经讲解了ViewPager的使用效果,这一讲我们继续对上一讲内容进行补充,继续深入学习一下ViewPager的另外的使用方法。
1. 实现效果如下图所画,这里需要注意的是一般我们在加载的时候可以从服务端通过http协议以json 数据格式来传递数据,因为自己还没学过服务端上面知识,所以这里仅做模仿,重点是演示在哪个方法中适合加载网络数据!
2. 案例实现1) 布局代码<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <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></RelativeLayout>
tab.xml:ViewPager页面布局<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- 自定义一个布局,用来填充ViewPager的显示页面,可以来自本地或者网络的数据 例如:图文混排的效果 --> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>[注意]:自定义布局是可以动态加载进来的2) 程序主要代码3. 程序执行结果public class MainActivity extends Activity { private ViewPager viewPager; private PagerTitleStrip pagerTitleStrip; private List<View> list = null; private List<String> title = null; private LayoutInflater inflater = null; //动态加载布局使用 private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initComponent(); /* * 动态加载布局 * 自定义布局是可以动态加载进来的,它是一个View的对象 * 如果涉及到网络可以在布局中自己定义一些数据,然后从网络中提取出来 */ 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"); //先初始化页面 adapter = new MyAdapter(); viewPager.setAdapter(adapter); /* * 查看api文档 setOnPageChangeListener 的几个方法说明 */ 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", "------------------------------"); } /* * @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrollStateChanged(int) * 点击pager时调用这个方法。 * 注意我们一般都是在这里开启线程去下载网络的数据,更新UI的操作 */ @Override public void onPageScrollStateChanged(int d) { // TODO Auto-generated method stub 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(ViewGroup container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(list.get(position)); return list.get(position); } @Override public void destroyItem(ViewGroup 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; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void initComponent(){ viewPager = (ViewPager)findViewById(R.id.viewpager); pagerTitleStrip = (PagerTitleStrip)findViewById(R.id.pagertitle); }}
[注意]:当用户第一次去加载的时候必须填充一下页面4. 程序说明注意到这个程序与上一个程序的不同是,这里我们加进了一个监听器,主要是用来监听滑动过程后从网络中下载数据的功能。
1) 查看ViewPager ViewPager.OnPageChangeListener 表示当界面的状态变化的时候这个接口会回调,这里面有三个需要实现的方法,如下图所示:2) 这个程序的重点主要是要判断在那个方法里面写加载网络数据的功能,我们可以通过相应方法中打印 Log 的来进行判断。仔细观察Log的输出情况,可以发现当我们在滑动过程中,都有调用onPageScrollStateChanged(int state)和onPageScrolled(int position, float positionOffset, int positionOffsetPixels)方法,结合api文档的方法说明,我们可以发现在滑动过程中,当新的布局滑进来的时候onPageScrollStateChanged(int state)方法的state值会逐次加1。同样onPageScrolled(int position, float positionOffset, int positionOffsetPixels)方法中,position的值也会逐次+1,positionOffset表示屏幕滑动过程中的偏移量在 [0, 1)之间。Log如下所示,当然最好读者可以自己去演示一遍
【注意】: 所以从这里我们也可以看出,在进行网络加载的过程中,我们最好是把要实现的UI更新操作放在onPageScrollStateChanged()方法进行,因为这个方法是在整个页面被加载的时候才会调用的,而onPageScrolled()方法是只要在滑动过程中,便会调用。
- 【Android 开发】:UI控件之 ViewPager 多页面滑动效果控件的的使用(二)
- 【Android 开发】:UI控件之 ViewPager 多页面滑动效果控件的的使用
- 【Android 开发】:UI控件之 AlertDialog 对话框控件的的使用(二)
- 【Android 开发】:UI控件之 ListView 列表控件的使用(二)
- 【Android 开发】:UI控件之 RatingBar 评分控件的使用
- 【Android 开发】:UI控件之 Gallery 画廊控件的使用
- 【Android 开发】:UI控件之 ListView 列表控件的使用
- 【Android 开发】:UI控件之 GridView 网格控件的使用
- 安卓控件使用系列32:ViewPager多页面滑动控件的使用方法1
- 安卓控件使用系列33:ViewPager多页面滑动控件的使用方法2
- Android ViewPager特效之水滴效果的滑动切换页面
- Android开发之ViewPager结合Fragment实现滑动页面的效果(源代码分享)
- 【Android 开发】:UI控件之 Menu 菜单的的使用(二)
- Android常用控件之ViewPager的使用
- 【Android 开发】:UI控件之 ScrollView垂直滚动控件 和 HorizontalScrollView水平滚动控件的使用
- 【Android 开发】:UI控件之 TimePickerDialog 时间对话框的使用
- 【Android 开发】:UI控件之 ProgressBar 进度条的使用
- Android开发之ViewPager滑动页面效果实现(源代码分享)
- CTime以及其它时间差CTimeSpan
- 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第二讲Hadoop图文训练课程:全球最详细的从零起步搭建Hadoop单机和伪分布式开发环境图文教程(长达88页的PDF)
- [OOAD]面向对象分析与设计之人机交互界面设计学习总结
- 数值自乘递归解
- 流程控制 NN矩阵
- 【Android 开发】:UI控件之 ViewPager 多页面滑动效果控件的的使用(二)
- Socket/TCP粘包、多包和少包, 断包
- WikiOI 1075 明明的随机数
- android 图片平铺与拉伸
- JavaIO部分
- 在对话框中设置背景的三种方法 .
- ndk-build C++优化
- WikiOI 1076 排序
- VMwvare中设置USB转串口