在Android开发中利用:viewpage实现一个轮播功能

  介绍

本篇文章给大家分享的是有关在Android开发中利用:viewpage实现一个轮播功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

: viewpage是一个常用的安卓组件,不过通常我们使用:viewpage的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验。此外,某些区域性的:viewpage(例如展示广告或者公告之类的:viewpage),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息。

循环滑动效果的实现:PagerAdapter

我们知道:viewpage自带的滑动效果非常出色,因此我们基本不需要处理这个滑动,只处理内容的显示。而内容的显示是由适配器控制的,因此这里重点就是这个适配器了。为简单起见,本例的每个视图直接是一张图片。下面是适配器的代码:

类ImageAdapter延伸PagerAdapter {
  私人ArrayListviewlist;
  公共ImageAdapter (ArrayListviewlist) {
  这一点。viewlist=viewlist;
  }
  @Override
  公共int getCount () {//设置成最大,使用户看不到边界
  返回Integer.MAX_VALUE;
  }
  @Override
  公共布尔isViewFromObject(视图arg0,对象__arg1) {
  返回arg0==__arg1;
  }
  @Override
  公共空间destroyItem (ViewGroup容器,int位置、对象对象){//警告:不要在这里调用removeView
  }
  @Override
  公共对象instantiateItem (ViewGroup容器,int位置){//对:viewpage页号求模取出视图列表中要显示的项
  位置%=viewlist.size ();
  如果(位置& lt;0) {
  位置=viewlist.size() +位置;
  }=viewlist.get ImageView视图(位置);//如果视图已经在之前添加到了一个父组件,则必须先删除否则会抛出IllegalStateException。
  ViewParent vp=view.getParent ();
  如果(vp !=null) {
  ViewGroup父母=(ViewGroup)副总裁;
  parent.removeView(查看);
  }
  container.addView(查看);//添加监听器如果有必要
  返回视图;
  }
  }

getCount()方法的返回值:这个值直接关系到:viewpage的“边界”,因此当我们把它设置为Integer.MAX_VALUE之后,用户基本就看不到这个边界了。当然,通常情况下设置为100倍实际内容个数也是可以的,之前看的某个实现就是这么干的。

instantiateItem()方法的位置处理:由于我们设置了计数为Integer.MAX_VALUE,因此这个位置的取值范围很大很大,但我们实际要显示的内容肯定没这么多(往往只有几项),所以这里肯定会有求模操作。但是,简单的求模会出现问题:考虑用户向左滑的情形,则位置可能会出现负值,所以我们需要对负值再处理一次,使其落在正确的区间内。

instantiateItem()方法父组件的处理:通常我们会直接addView,但这里如果直接这样写,则会抛出IllegalStateException。假设一共有三个视图,则当用户滑到第四个的时候就会触发这个异常,原因是我们试图把一个有父组件的视图中添加到另一个组件。但是,如果直接写成下面这样:

(ViewGroup) view.getParent () .removeView(视图),

则又会因为一开始的时候组件并没有父组件而抛出NullPointerException。因此,需要进行一次判断。也就是上面的代码。

destroyItem()方法:由于我们在instantiateItem()方法中已经处理了删除的逻辑,因此这里并不需要处理。实际上,实验表明这里如果加上了删除的调用,则会出现:viewpage的内容为空的情况。

集成代码:MainActivity

简单布局activity_main:

& lt; RelativeLayout xmlns: android=癶ttp://schemas.android.com/apk/res/android"   xmlns:工具=癶ttp://schemas.android.com/tools"   android: layout_width=癿atch_parent"   android: layout_height=癿atch_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"   工具:上下文=癱om.example.viewpagerdemo.MainActivity"比;   & lt; android.support.v4.view.ViewPager   android: id=癅 + id/main_viewpager"   android: layout_width=癿atch_parent"   android: layout_height=?50 dp"   android: layout_gravity=癱enter"比;   & lt;/android.support.v4.view.ViewPager>   & lt;/RelativeLayout>

代码操作MainActivity:

公共类MainActivity扩展活动
  私有静态最终字符串LOG_TAG=癕ainActivity";
  私人ImageHandler处理程序=new ImageHandler(新的WeakReference

在Android开发中利用:viewpage实现一个轮播功能