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);//铺满屏幕
随机推荐
- (python) 标准模块sys和os的使用
一.sys模块 包含了系统的相关的功能.我们来学习sys.argv,它包含命令行参数. 例子:定义了一个add函数,用来实现两个整数的相加. #! coding=utf-8 # usersys.py ...
- delphi XE5皮肤的使用
做皮肤其实是项浩大的工程,从美工设计.到贴图.到程序设计,都非常的麻烦,如果不是一个非常成熟的产品且有很大的用户群体,并且公司具有相当实力,一般都不会去自己做皮肤,毕竟涉及的东西太多,一旦出现问题 ...
- 2.Nginx优化
[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine ...
- 基音周期提取2-基于线性相关系数的Matlab实现
基音周期提取2-基于线性相关系数的Matlab实现 基音周期提取结果 图1 基音提取结果 算法说明 线性相关系数 也称"皮尔逊积矩相关系数"(Pearson product-mom ...
- 初学python第二天
今天我将用python来编写一款小游戏,用这个来总结一下自己学过的一些基础语法.没错,它就是井字游戏.想想自己第一接触这种游戏,还是小学生呢
- 关于PHP堆栈与列队
在PHP中数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用.PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素.堆栈与 ...
- XPath使用示例
1.查找空节点//*[not(text())] 表示内容为空的节点//*[count(*)=0] 表示没有子节点的节点"//*[count(*)=0 and n ...
- css小技巧
每逢大的灾难的时候,很多网站变成了灰色,如何让网站快速变灰?css代码是很简单的,用的是css的filter功能. html { filter: grayscale(100%);//IE浏览器 -we ...
- Linux网卡bounding详解
多块网卡绑在一起,作为一个网卡用,实现负载均衡和提高带宽 linux双网卡绑定一个IP地址,实质工作就是使用两块网卡虚拟为一块,使用同一个IP地址,是我们能够得到更好的更快的服务.其实这项技术在 ...
- Zabbix日志监视的汇总报警(更新发送邮件脚本)
Zabbix的用户一定会碰到这种情况: 日志报警一般设置的是multiple模式,有错误大量写入的时候,每写入一行就会触发一次action,导致出现大量的报警邮件. 特别是ora的报警,经常一出就是上 ...