ViewPager自身并不支持左右无限循环的功能,在网上找了很多天,发现基本都是一个原理,就是实现一种假的无限循环,取一种最大值的思路,这一种方案在上一篇中实现过,并没有真正达到左右无限循环,只是一般情况下,很难达到边界(不可滑动)的情况。下面记录一下另一种方案,网上号称是真正的无限循环。
用于显示的mViews,比数据源mList,多了两个节点元素(头节点0:b和尾节点5:e用于跳转)
下图的不带箭头的红线,是mViews根据mList初始化的情况;带箭头的红线是跳转的情况。
首先还是布局文件:
1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. xmlns:tools="http://schemas.android.com/tools"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent" >
5.
6. <android.support.v4.view.ViewPager
7. android:id="@+id/viewpager"
8. android:layout_width="match_parent"
9. android:layout_height="match_parent" >
10. </android.support.v4.view.ViewPager>
11.
12. <LinearLayout
13. android:layout_width="fill_parent"
14. android:layout_height="wrap_content"
15. android:layout_alignBottom="@id/viewpager"
16. android:background="#33000000"
17. android:orientation="vertical"
18. android:padding="5dip" >
19.
20. <TextView
21. android:id="@+id/tv_image_description"
22. android:layout_width="wrap_content"
23. android:layout_height="wrap_content"
24. android:layout_gravity="center_horizontal"
25. android:text="第一个引导页面"
26. android:textColor="@android:color/white"
27. android:textSize="14sp" />
28.
29. <LinearLayout
30. android:id="@+id/ll_points"
31. android:layout_width="wrap_content"
32. android:layout_height="wrap_content"
33. android:layout_marginTop="5dip"
34. android:layout_gravity="center_horizontal"
35. android:orientation="horizontal" >
36. </LinearLayout>
37. </LinearLayout>
38.
39. </RelativeLayout>
接下来是MainActivity:
1. package com.example.viewpagertest;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. import android.app.Activity;
7. import android.os.Bundle;
8. import android.support.v4.view.PagerAdapter;
9. import android.support.v4.view.ViewPager;
10. import android.support.v4.view.ViewPager.OnPageChangeListener;
11. import android.view.View;
12. import android.view.ViewGroup;
13. import android.widget.ImageView;
14.
15. public class MainActivity extends Activity implements OnPageChangeListener {
16.
17. private List<ImageView> imageViewList;
18. private ViewPager mViewPager;
19.
20.
21. @Override
22. protected void onCreate(Bundle savedInstanceState) {
23. super.onCreate(savedInstanceState);
24. setView();
25. initView();
26. }
27.
28. public void setView() {
29. setContentView(R.layout.activity_splash_viewpager);
30.
31. }
32.
33. public void initView() {
34. mViewPager = (ViewPager) findViewById(R.id.viewpager);
35. prepareData();
36.
37. new ViewPagerAdapter();
38. mViewPager.setAdapter(adapter);
39. this);
40. }
41.
42. private void prepareData() {
43. new ArrayList<ImageView>();
44. int[] imageResIDs = getImageResIDs();
45. ImageView iv;
46. for (int i = 0; i < imageResIDs.length; i++) {
47. new ImageView(this);
48. iv.setBackgroundResource(imageResIDs[i]);
49. imageViewList.add(iv);
50.
51. }
52. }
53.
54. /**
55. * 在此处本来是5张图片,现在在数组首尾各加了一张图
56. * @return
57. */
58. private int[] getImageResIDs() {
59. return new int[]{
60. R.drawable.pic_02,
61. R.drawable.bg1,
62. R.drawable.bg2,
63. R.drawable.bg3,
64. R.drawable.pic_01,
65. R.drawable.pic_02,
66. R.drawable.bg1,
67.
68. };
69. }
70.
71. class ViewPagerAdapter extends PagerAdapter {
72.
73. @Override
74. public int getCount() {
75. return imageViewList.size();
76. }
77.
78. /**
79. * 判断出去的view是否等于进来的view 如果为true直接复用
80. */
81. @Override
82. public boolean isViewFromObject(View arg0, Object arg1) {
83. return arg0 == arg1;
84. }
85.
86. /**
87. * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来就是position
88. */
89. @Override
90. public void destroyItem(ViewGroup container, int position, Object object) {
91. container.removeView(imageViewList.get(position));
92. }
93.
94. /**
95. * 创建一个view
96. */
97. @Override
98. public Object instantiateItem(ViewGroup container, int position) {
99. container.addView(imageViewList.get(position));
100. return imageViewList.get(position);
101. }
102. }
103.
104. @Override
105. public void onPageScrollStateChanged(int arg0) {
106.
107. }
108.
109. @Override
110. public void onPageScrolled(int arg0, float arg1, int arg2) {
111.
112. }
113.
114. @Override
115. public void onPageSelected(int position) {
116. if ( imageViewList.size() > 1) { //多于1,才会循环跳转
117. if ( position < 1) { //首位之前,跳转到末尾(N)
118. 5;
119. false);
120. else if ( position > 5) { //末位之后,跳转到首位(1)
121. 1,false); //false:不显示跳转过程的动画
122. 1;
123. }
124. }
125. }
126.
127. @Override
128. protected void onDestroy() {
129. super.onDestroy();
130. }
131.
132. }
1. mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画
上面的代码只是一个简单的Demo,如果不将跳转动画去掉的话,首尾页跳转的时候过渡效果会很不自然。