欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ViewPager实现无限循环的实例

程序员文章站 2022-03-24 18:16:39
android viewpager实现无限循环的实例 viewpager自身并不支持左右无限循环的功能,这里就提供一种方案让android viewpager实现左右无限...

android viewpager实现无限循环的实例

viewpager自身并不支持左右无限循环的功能,这里就提供一种方案让android viewpager实现左右无限循环的功能,这里记录下:

用于显示的mviews,比数据源mlist,多了两个节点元素(头节点0:b和尾节点5:e用于跳转)

下图的不带箭头的红线,是mviews根据mlist初始化的情况;带箭头的红线是跳转的情况。

Android ViewPager实现无限循环的实例

首先还是布局文件:

<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.support.v4.view.viewpager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
  </android.support.v4.view.viewpager> 
 
  <linearlayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignbottom="@id/viewpager" 
    android:background="#33000000" 
    android:orientation="vertical" 
    android:padding="5dip" > 
 
    <textview 
      android:id="@+id/tv_image_description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:text="第一个引导页面" 
      android:textcolor="@android:color/white" 
      android:textsize="14sp" /> 
 
    <linearlayout 
      android:id="@+id/ll_points" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margintop="5dip" 
      android:layout_gravity="center_horizontal" 
      android:orientation="horizontal" > 
    </linearlayout> 
  </linearlayout> 
 
</relativelayout> 

接下来是mainactivity:

package com.example.viewpagertest; 
 
import java.util.arraylist; 
import java.util.list; 
 
import android.app.activity; 
import android.os.bundle; 
import android.support.v4.view.pageradapter; 
import android.support.v4.view.viewpager; 
import android.support.v4.view.viewpager.onpagechangelistener; 
import android.view.view; 
import android.view.viewgroup; 
import android.widget.imageview; 
 
public class mainactivity extends activity implements onpagechangelistener { 
 
  private list<imageview> imageviewlist; 
  private viewpager mviewpager; 
 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setview(); 
    initview(); 
  } 
 
  public void setview() { 
    setcontentview(r.layout.activity_splash_viewpager); 
 
  } 
 
  public void initview() { 
    mviewpager = (viewpager) findviewbyid(r.id.viewpager); 
    preparedata(); 
     
    viewpageradapter adapter = new viewpageradapter(); 
    mviewpager.setadapter(adapter); 
    mviewpager.setonpagechangelistener(this); 
  } 
   
   private void preparedata() { 
      imageviewlist = new arraylist<imageview>(); 
      int[] imageresids = getimageresids(); 
      imageview iv; 
      for (int i = 0; i < imageresids.length; i++) { 
        iv = new imageview(this); 
        iv.setbackgroundresource(imageresids[i]); 
        imageviewlist.add(iv); 
         
      } 
    } 
     
   /** 
   * 在此处本来是5张图片,现在在数组首尾各加了一张图 
   * @return 
   */ 
    private int[] getimageresids() { 
      return new int[]{ 
          r.drawable.pic_02, 
          r.drawable.bg1, 
          r.drawable.bg2, 
          r.drawable.bg3, 
          r.drawable.pic_01, 
          r.drawable.pic_02, 
          r.drawable.bg1, 
 
      }; 
    } 
     
    class viewpageradapter extends pageradapter { 
 
      @override 
      public int getcount() { 
        return imageviewlist.size(); 
      } 
 
      /** 
       * 判断出去的view是否等于进来的view 如果为true直接复用 
       */ 
      @override 
      public boolean isviewfromobject(view arg0, object arg1) { 
        return arg0 == arg1; 
      } 
 
      /** 
       * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来就是position 
       */ 
      @override 
      public void destroyitem(viewgroup container, int position, object object) { 
        container.removeview(imageviewlist.get(position)); 
      } 
 
      /** 
       * 创建一个view 
       */ 
      @override 
      public object instantiateitem(viewgroup container, int position) { 
        container.addview(imageviewlist.get(position)); 
        return imageviewlist.get(position); 
      } 
    } 
 
    @override 
    public void onpagescrollstatechanged(int arg0) { 
       
    } 
 
    @override 
    public void onpagescrolled(int arg0, float arg1, int arg2) { 
       
    } 
 
    @override 
    public void onpageselected(int position) { 
      if ( imageviewlist.size() > 1) { //多于1,才会循环跳转 
        if ( position < 1) { //首位之前,跳转到末尾(n) 
          position = 5;  
          mviewpager.setcurrentitem(position,false); 
        } else if ( position > 5) { //末位之后,跳转到首位(1) 
          mviewpager.setcurrentitem(1,false); //false:不显示跳转过程的动画 
          position = 1; 
        } 
      }   
    } 
 
  @override 
  protected void ondestroy() { 
    super.ondestroy(); 
  } 
 
} 

mviewpager.setcurrentitem(1,false); //false:不显示跳转过程的动画 

上面的代码只是一个简单的demo,如果不将跳转动画去掉的话,首尾页跳转的时候过渡效果会很不自然。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!