文档章节

ViewPager的使用和无限滚动的实现

Dio_V
 Dio_V
发布于 2015/12/21 16:12
字数 890
阅读 223
收藏 8

#ViewPager的介绍#

ViewPager是v4包中提供的一个控件,主要用于实现多页面的切换。先来看一下官方文档的介绍:

Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.

ViewPager允许用户将页面想左右滑动。想要生成展示内容的页面,你需要提供一个实现PagerAdapter的子类。

从官方文档的介绍可以看出来,ViewPager的使用有些类似于ListView和GridView,也是需要一个适配器来提供展示的数据的。

#ViewPager的简单实现

官方的建议是将ViewPager与Fragment结合起来使用,在这里我只是简单的实现实现一下ViewPager展示多个图片

  1. 要使用ViewPager首先需要在导入v4包

     dependencies {
         compile 'com.android.support:appcompat-v7:23.1.1'
     }
    
  2. 在布局文件中使用

     <?xml version="1.0" encoding="utf-8"?>
     <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="wrap_content"
     	tools:context="com.example.dio.viewpagerdemo.MainActivity">
    
     	<android.support.v4.view.ViewPager
     	    android:id="@+id/vpDemo"
     	    android:layout_width="wrap_content"
     	    android:layout_height="200dp"></android.support.v4.view.ViewPager>
    
     </RelativeLayout>
    

导入V4后,就可以直接在XML文件中使用ViewPager了。

  1. 设置适配器PagerAdapter.

     public class ViewPageAdapter extends PagerAdapter {
    
         private List<ImageView> list;
    
         public ViewPageAdapter(List<ImageView> list) {
             this.list = list;
         }
    
     	//要展示的内容的总数
         @Override
         public int getCount() {
             return list.size();
         }
    
     	//是否对展示的view进行缓存
         @Override
         public boolean isViewFromObject(View view, Object object) {
             return view == object;
         }
    
     	//将要展示的view添加到ViewPager中,并且返回该view
         @Override
         public Object instantiateItem(ViewGroup container, int position) {
             ImageView imageView = list.get(position);
             container.addView(imageView);
             return imageView;
         }
    
     	//销毁view
         @Override
         public void destroyItem(ViewGroup container, int position, Object object) {
             container.removeView(list.get(position));
         }
     }
    

继承PagerAdapter必须实现getCount()和isViewFromObject()两个抽象方法。此外还要重写instantiateItem()和destoryItem()方法。

  1. 为ViewPager绑定适配器

     private void initData() {
         int[] imageRes = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
         list = new ArrayList<>();
         for (int i = 0; i < imageRes.length; i++) {
             ImageView imageView = new ImageView(getApplicationContext());
             imageView.setBackgroundResource(imageRes[i]);
             list.add(imageView);
     	}
     }
    
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         vpDemo = (ViewPager) findViewById(R.id.vpDemo);
         initData();
         vpDemo.setAdapter(new ViewPageAdapter(list));
     }
    

因为只是简单的在ViewPager中添加图片,所以只为适配器中添加了List<ImageView>的数据。

#ViewPager的无限循环

当使用ViewPager来展示页面的滚动时,通常都需要使其能够进行无限循环的滚动。目前用于实现这一功能的方法一般有两种:

  1. 设置ViewPager的总数为一个很大的值,设置起始页面为总数的中间。用户在使用时向左右滑动一般无法滑动到头,所以是一个伪·无限滚动
  2. 在存放View的集合第一个位置添加最后一个View,并在最后一个天津爱第一个View。当滑动到最后时跳转回第一个View,滑动到最前面时,跳动到最后一个View。

这里只实现第二种方式。主要就是在Adapter中实现。

	public class ViewPageAdapter extends PagerAdapter {

		    private List<ImageView> mList;
			
			//在适配器中给List的开始和最后添加上指定的view
		    public ViewPageAdapter(List<ImageView> list) {
		        mList.add(list.get(0));
				for(int i=0; i<list.size(); i++){
					mList.add(list.get(i));
				}
				mList.add(list.get(list.size()-1));
		    }
			
			//要展示的内容的总数
		    @Override
		    public int getCount() {
		        return list.size()+2;
		    }
			
			//是否对展示的view进行缓存
		    @Override
		    public boolean isViewFromObject(View view, Object object) {
		        return view == object;
		    }
			
			//将要展示的view添加到ViewPager中,并且返回该view
		    @Override
		    public Object instantiateItem(ViewGroup container, int position) {
		        ImageView imageView = list.get(position);
		        container.addView(imageView);
		        return imageView;
		    }
			
			//销毁view
		    @Override
		    public void destroyItem(ViewGroup container, int position, Object object) {
		        container.removeView(list.get(position));
		    }
		}

此外给ViewPager设置滚动监听器

	viewPager.setOnPageChangeListener(new OnPageChangeListener() {  
    @Override  
    public void onPageSelected(int position) {
		//当滑动到起始和最后时,设置当前位置  
        if(position==list.size()-1){  
            viewPaper.setCurrentItem(0, false);  
        }else if(position==0){
			viewPager.setCurrentItem(list.size()-2, false);
		}  
    } 

© 著作权归作者所有

Dio_V
粉丝 1
博文 6
码字总数 6746
作品 0
程序员
私信 提问
加载中

评论(1)

今晚吃烧烤
今晚吃烧烤
兄弟能给个demo吗?
ViewPager实现循环滑动

在网上看到了viewpager之后自己看了看,效果不错,同样eoe社区也有很多相关的文章,比如http://www.eoeandroid.com/forum.php?mod=viewthread&tid=157771&page=21#pid1384160,大家可以看看,...

MrLovelyCbb
2012/05/08
0
3
Android 打造一个丝滑的自动轮播控件

现在很多的 App 都有自动轮播的 banner 界面,用于展示广告图片或者显示当前比较热门的一些活动,除了具备比较酷炫的效果之外,通过轮播的方式来减少对界面的占用,也是很赞的一个设计点。本...

developerHaoz
2018/08/08
0
0
Android ViewPager和ScrollView嵌套滚动问题解决方案

问题描述: 我的嵌套是ViewPager-->ScrollView-->ViewPager. 首先最里面的ViewPager水平滚动时总是会触发最外层的ViewPager滚动,看了网上很多的解决办法基本上是一样的,需要自定义ViewPag...

冰珊孤雪
2015/04/22
0
2
Android NestedScrollView/ScrollView包裹ViewPager自适应高度

Android NestedScrollView/ScrollView包裹ViewPager自适应高度 当Android的NestedScrollView/ScrollView这类滚动View包裹ViewPager时候,ViewPager中的Fragment包含的又是一系列高度值不固定...

zhangphil
2018/05/12
0
0
让ViewPager不可以滚动

关于ViewPager滚动的拦截首先得知道他怎么就可以滚动了.才有可能去拦截他,不让他滚动. 那么关于触摸事件,想当然的就会想到onInterceptTouchEvent方法和onTouchEvent方法. 当一个ViewGroup的o...

-___-
2016/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java的线程同步和并发问题示例

并发问题 多线程是一个非常强大的工具,它使我们能够更好地利用系统的资源,但我们需要在读取和写入多个线程共享的数据时特别小心。 当多个线程尝试同时读取和写入共享数据时,会出现两种类型...

hiuh
今天
1
0
Spring Boot 常用注解说明

实体类 @Entity (实体类注解) @Table(可指定表名) @Data(可缺省get/set) @Id (指定属性主键) @GeneratedValue(指定主键生成规则)

兜兜毛毛
今天
3
0
局域网能互相ping通,ubuntu虚拟机不能上外网

【问题】 桥接模式老是无法上网,查看本机IP发现被分配了一个私网地址,猜测应该是虚拟DHCP服务器没有打开,于是查看Ubuntu的网络配置: /etc/network/interfaces 发现没有dhcp配置的信息,只...

tahiti_aa
今天
2
0
以太坊助记词PHP开发包简介

以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包 。 1、开发包概述 以太坊助记词PHP开发包主要包括以下特性: 生成符合BIP39...

汇智网教程
昨天
4
0
系统监控-分布式调用链Skywalking

1. 为什么要使用分布式调用链技术? 随着公司业务的高速发展,公司服务之间的调用关系愈加复杂,如何理清并跟踪它们之间的调用关系就显的比较关键。线上每一个请求会经过多个业务系统,并产生...

秋日芒草
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部