当前位置: 移动技术网 > IT编程>移动开发>Android > Android ViewPager实现无限循环的实例

Android ViewPager实现无限循环的实例

2019年07月24日  | 移动技术网IT编程  | 我要评论

伽利略的故事,薛丁山征西txt,最新喜剧电影大全

android viewpager实现无限循环的实例

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

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

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

首先还是布局文件:

<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,如果不将跳转动画去掉的话,首尾页跳转的时候过渡效果会很不自然。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网