Android中viewPager的一两点使用
Android中viewPager的一两点使用
viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用。这里只简单说下直接使用。
使用viewPager的步骤如下:
(1)在布局中放入viewPager的控件
(2)设置加载到viewPager中的view
(3)编写viewPager特有的adapter
(4)实例化viewPager并给他绑定上步设置的adapter
这个步骤体现的也是MVC思想,可以参考我之前的博文http://www.cnblogs.com/qifengshi/p/5056468.html
这里为了方便说明 我新建一个项目来说明viewPager的使用
步骤一 在布局中新建一个viewPager
布局文件如下:
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v4.view.ViewPager>
设置加载到viewPager中的view
这里为了方便,显示设置2个不同背景的颜色的view,放入viewPager中,每个view的布局如下图:
item_one
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light">
</LinearLayout>
item_two
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright">
</LinearLayout>
编写viewPager特有的adpter
这里我们继承viewPager的PagerAdapter,主要重写getCount方法、destroyItem 、instantiateItem 、isViewFromObject 、。代码如下:
public class Adapter extends PagerAdapter{
private List<View> views;
public Adapter(List<View> views){
this.views = views;
}
@Override
public int getCount() {
return views.size();
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(views.get(arg1));
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(views.get(arg1), 0);
return views.get(arg1);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
// return false;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
}
实例化viewPager并绑定Adapter
这里,实例化viewPager 为mpager ,然后将建好的view:item_one 和item_two 通过LayoutInflater加载到建好的View类型的数组中。将数组加到List<View>里面。作为参数传入到adapter。代码如下:
private ViewPager mpager;
private List<View> myview = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mpager = (ViewPager) findViewById(R.id.view_pager);
LayoutInflater mInflater = getLayoutInflater();
View [] pagers = {mInflater.inflate(R.layout.item_one ,null),
mInflater.inflate(R.layout.item_two , null)};
for(int i = 0; i < pagers.length ; i++) {
myview.add(pagers[i]);
}
Adapter ad = new Adapter(myview);
mpager.setAdapter(ad);
mpager.setCurrentItem(0);
}
PS :实现viewPager手动无限循环
这里用一种设置页面跳转的方式来实现无限循环。在myviews数组中加入两个view,分别在第0个位置加入最后一个itemview,和最后一个位置加入第一个itemview。代码如下所示:
final View [] pagers = {mInflater.inflate(R.layout.item_one ,null),
mInflater.inflate(R.layout.item_two , null),
mInflater.inflate(R.layout.item_three,null)};
for(int i = 0; i < pagers.length ; i++) {
myview.add(pagers[i]);
}
myview.add(0,mInflater.inflate(R.layout.item_three , null));
myview.add(4, mInflater.inflate(R.layout.item_one, null));
这里为了测试方便,这里在上个基础上加入了一个item,就是三张view循环播放
用来实现衔接。当向右滑动到最后一个页面的时候,将这个页指定为第一个view所在的页,向左滑动到第一个页面的时候,将这个页面制定为最后一个view所在页。注意这里的view最后一个不是指数组的最后一个 而是指三个view中最后一个。
设置viewPager的实例化对象的方法setOnPageChangeListener 虽然此方法显示不推荐使用,但为了实现这个功能,还是先将就用吧。等日后谷歌更新viewPager,能有属性自动实现循环。
代码如下:
mpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int index = position;
if(index == 0){
//注意这里pagers数组,不是myviews数组
index = pagers.length;
}else if(position == pagers.length + 1){
index = 1;
}
if(position != index){
mpager.setCurrentItem(index, false);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
重写Adapter中的instantiateItem 方法来显示view
public Object instantiateItem(View arg0, int arg1) {
if(arg1 == 0){
((ViewPager) arg0).removeView(views.get(myview.size() - 3));
((ViewPager) arg0).addView(views.get(myview.size() - 3), 0);
}else if(arg1 == myview.size() - 1){
((ViewPager) arg0).removeView(views.get(0));
((ViewPager) arg0).addView(views.get(0), 0);
}else{
((ViewPager) arg0).addView(views.get(arg1), 0);
}
return views.get(arg1);
}
这样无限滑动就可以简单实现,但在滑动时会出现有空白页面的bug,可能是因为先removeView,在加入view的原因。
Activity与ViewPager中Fragment之间的互动
在Fragment中,可以调用getActivity().findViewById()的方法实现对Activity中的控件进行操作。
在Activity中,可以调用viewPager.getAdapter().instantiateItem(viewPager, index);实现得到当前的ViewPager中的fragment。注意一定要是通过instantiateItem得到,如果通过getItem得到的fragment返回的会是NULL,因为这个是新生成的fragment。而不是已经加载进去的fragment。
Android中viewPager的一两点使用的更多相关文章
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)
Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:a ...
- android中viewPager实现的屏幕左右切换(入门篇)
大多数的APP都可以实现几个屏幕来回的切换, 首先新建两个Activity,内容随意,布局随意.接下来在MainActivity.xml: <RelativeLayout xmlns:andro ...
- android 中 viewpager 滑动的指示器
先看下效果图: 这个需要用到1个开源的 库,这个后面也会说下的. 工程目录: 1. MainActivity.java public class MainActivity extends Fragme ...
- Android中ViewPager的使用
我们在一个apk中第一次開始的时候,会有一个guide界面.一般使用ViewPager来完毕. 布局文件例如以下: <? xml version="1.0" encoding ...
- android 中 ViewPager 的平常用法 ViewPager+ Views
延续前面几个的经常用到的ViewPager, 直接加载各种不同的 View 工程目录: 代码: public class ViewActivity extends Activity { // 每个Vi ...
- Android中ViewPager如何设置不能通过屏幕左右滑动来切换页面
//很多时候,我想禁止用户通过屏幕的左右滑动来切换界面!如何实现! //创建一个类继承viewpager,实现 onTouchEvent 和 onInterceptTouchEvent方法,都 ...
- Android中ViewPager动态创建的ImageView铺满屏幕
ImageView imageView=new ImageView(context); imageView.setScaleType(ScaleType.FIT_XY);//铺满屏幕
随机推荐
- php-4种排序
<?php$arr = array(1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39); //1. 冒泡排序 //在要排序的一组数中,对当前还未排好的序列,从前 ...
- mysql解压缩安装(一)
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- JS-数组的方法
var arr = [ 1,2,3 ];arr.push( 'abc' );//从后面加 arr.unshift( 0 );//从前面加 arr.pop()//从后面删除 arr.shift()//从 ...
- smarty模板中获得循环次数
在smarty中可以有两种写法来获得循环次数(当然lz只会这两种:>,要是有大神会有其他的,欢迎补充) 写法一: {section name=loop loop=3} {$smarty.loop ...
- codeIgniter怎么实现对input type=text对话框blur事件的监听以及传值?
如题,这个问题怎么解决? 用JS和前端框架习惯了,现在学后端框架,感觉各种坑...
- 基音周期提取2-基于线性相关系数的Matlab实现
基音周期提取2-基于线性相关系数的Matlab实现 基音周期提取结果 图1 基音提取结果 算法说明 线性相关系数 也称"皮尔逊积矩相关系数"(Pearson product-mom ...
- CentOS常用的文件操作命令
CentOS下面常用的文件操作命令: cd pwd NO1. 显示当前路径 [root@rehat root]# pwd NO2. 返回用户主目录 [root@rehat root]# cd NO3. ...
- JavaScript标准库之——JSON
JSON 对象包含了两个方法,一是解析 JavaScript Object Notation (JSON),二是将值转换为 JSON.这个对象本身不能被调用或者作为构造函数,除了它的这两个方法属性外 ...
- DIY操作系统(引文)
构想根据<30天自制操作系统>以及<ORANGE’S:一个操作系统的实现>初步实现一个操作系统. 先开个头,以后的棋一步一步下.
- p68 对数变换 关于fft2 fftshift 频谱
p68 频谱:绝大多数信号可分解若干不同频率的正弦波, 些正弦波中,频率最低的称为信号的基波,其余称为信号谐波,相当于该信号的基本频率.频率等于基频整数倍的正弦波分量称为谐波. 1.fft2 fft ...