无尽的循环ViewPager

无尽的循环ViewPager

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

现在的情况

不改变的源代码,什么时候ViewPager滑动到最后item的时候,他就无法再往右滑动;当ViewPager滑动到第一个item的时候,他也无法再往前滑动。

(以上全是废话)

设想

我们能够这样想。当滑动到最后一个的时候,我们让他跳转到第一个,这样他就能够继续往后滑动了,这样就达到了我们想要的循环滑动。

尽管功能上是循环了,可是实际显示的时候会在最后一个和第一个之间自己主动跳转。

优化

我们能够在原来的链表中首尾各添加一个假的item。用多余的两个item来作跳转的动作,这样就能够避免出现自己主动跳转的错误画面了。

我们要显示的是以下ABC画面。位置各自是012.

 

 无尽的循环ViewPager

 

 

实际上,我们加入数据的时候,多加入了2个。

在位置0加入了最后一个界面C,在位置4加入了第一个界面A

 无尽的循环ViewPager

当界面滑动到位置3的时候,他还能够往右滑动,这样给人的感觉就是循环的。但,当滑动到位置4的时候。他右边没有了,这样岂不是露馅了?所以,当滑动到位置4的时候。立马跳转到位置1

由于他们是相同的数据,所以从显示效果是看不出跳转了的。这样实际上我们就变成了位置1,这样就又能够继续往右滑动了。

反复上面条件的推断。这样就实现了往右的循环。往左也是相同的道理。

代码分析

onPageSelected里面做条件推断,在onPageScrollStateChanged里面做跳转。

关键代码例如以下:

初始化。首尾各添加一个item

// 添加第1个界面,实际上他显示的是最后一个界面
addTextView(POINT_LENGTH - 1);
// 添加实际显示的2、3、4界面
for (int i = 0; i < 3; i++) {
addTextView(i);
addPoint(i);
}
// 添加最后的第5个界面,实际上他显示的是第一个界面
addTextView(0);

条件推断:

	@Override
	public void onPageSelected(int pPosition) {
		mIsChanged = true;
		if (pPosition > POINT_LENGTH) {
			mCurrentPagePosition = FIRST_ITEM_INDEX;
		} else if (pPosition < FIRST_ITEM_INDEX) {
			mCurrentPagePosition = POINT_LENGTH;
		} else {
			mCurrentPagePosition = pPosition;
		}
		Log.i(TAG,"当前的位置是"+mCurrentPagePosition);
		setCurrentDot(mCurrentPagePosition);
	}

跳转:

	@Override
	public void onPageScrollStateChanged(int pState) {
		if (ViewPager.SCROLL_STATE_IDLE == pState) {
			if (mIsChanged) {
				mIsChanged = false;
				mViewPager.setCurrentItem(mCurrentPagePosition, false);
			}
		}
	}

完整的逻辑例如以下:

package com.ahacool.circleviewpager;

import java.util.ArrayList;

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.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

/**
 * @ClassName MainActivity
 * @Description 循环滑动viewpager的一种方法,滑动非常流畅。实现方法:在实际显示的界面头和尾分别添加一个界面。

* @author Moto * @date 2014 2014-7-18 * */public class MainActivity extends Activity implements OnPageChangeListener { private ViewPager mViewPager; private ViewGroup mPointViewGroup; private ArrayList<View> mViewPagerList; private boolean mIsChanged = false; private int mCurrentPagePosition = FIRST_ITEM_INDEX; private int mCurrentIndex; private static final int POINT_LENGTH = 3; private static final int FIRST_ITEM_INDEX = 1; private static final String TAG = "MOTO"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); } private void initUI() { mViewPager = (ViewPager) findViewById(R.id.viewpager); mPointViewGroup = (ViewGroup) findViewById(R.id.point_layout); mViewPagerList = new ArrayList<View>(); // 添加第1个界面,实际上他显示的是最后一个界面 addTextView(POINT_LENGTH - 1); // 添加实际显示的2、3、4界面 for (int i = 0; i < 3; i++) { addTextView(i); addPoint(i); } // 添加最后的第5个界面,实际上他显示的是第一个界面 addTextView(0); PagerAdapter pagerAdapter = new CustomPagerAdapter(mViewPagerList); mViewPager.setAdapter(pagerAdapter); mViewPager.setOnPageChangeListener(this); mViewPager.setCurrentItem(mCurrentPagePosition, false); } private void addTextView(int pIndex) { TextView textview = new TextView(this); textview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); textview.setGravity(Gravity.CENTER); textview.setText("这是第" + (pIndex + 1) + "个页面"); textview.setTextSize(50); mViewPagerList.add(textview); } private void addPoint(int pIndex) { ImageView pointImageView = new ImageView(this); LayoutParams layoutParams = new LayoutParams(20, 20); layoutParams.setMargins(10, 0, 10, 0); pointImageView.setLayoutParams(layoutParams); pointImageView.setBackgroundResource(R.drawable.point_style); if (0 == pIndex) { pointImageView.setEnabled(false); } mPointViewGroup.addView(pointImageView); } private void setCurrentDot(int positon) { // 界面实际显示的序号是第1, 2, 3。而点的序号应该是0, 1, 2.所以减1. positon = positon - 1; if (positon < 0 || positon > mViewPagerList.size() - 1 || mCurrentIndex == positon) { return; } mPointViewGroup.getChildAt(positon).setEnabled(false); mPointViewGroup.getChildAt(mCurrentIndex).setEnabled(true); mCurrentIndex = positon; } @Override public void onPageScrollStateChanged(int pState) { if (ViewPager.SCROLL_STATE_IDLE == pState) { if (mIsChanged) { mIsChanged = false; mViewPager.setCurrentItem(mCurrentPagePosition, false); } } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int pPosition) { mIsChanged = true; if (pPosition > POINT_LENGTH) { mCurrentPagePosition = FIRST_ITEM_INDEX; } else if (pPosition < FIRST_ITEM_INDEX) { mCurrentPagePosition = POINT_LENGTH; } else { mCurrentPagePosition = pPosition; } Log.i(TAG,"当前的位置是"+mCurrentPagePosition); setCurrentDot(mCurrentPagePosition); }}

源代码下在地址:https://github.com/bird7310/Demos.git

 

总结

希望对大家有帮助。多提意见。

近段时间项目非常赶,非常长时间没看书写博客了。

赶项目赶得都麻,放松。偷偷懒。写博客是。

 

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117016.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Protel 99 SE 的坑

    Protel 99 SE 的坑作为一个电子爱好者,以前画电路图基本都是用笔在草稿纸上面直接画出电路图,然后焊板子~呵呵,有点简单粗暴,这样做的好处就是比较顺手,没那么多限制,但是EDA还是有必要学一下的,思来想去,还是学学Protel99se吧,第一次接触,各种懵比,还犯了许多低级错误,以及系统不兼容的坑,苦逼了…>>>坑1:添加元件库添加元件库:add/Remove选择sch路径点击ddb文件-add

    2022年5月30日
    54
  • SQLServer找不到配置管理器,如何打开配置管理器

    SQLServer找不到配置管理器,如何打开配置管理器总有些sqlserver安装完毕之后找不到配置管理器,想看个端口号或者看个服务的用户名,都很气。下面来介绍一下通过windows命令来打开SQLSERVER配置管理器。首先:windows键+R键各个sqlserver版本在textbox中输入对应的命令如下:SQLServerManager13.msc(对于SQLServer2016)SQLServerManager12.ms…

    2022年7月21日
    15
  • stm32h7串口dma发送_串口通信流程

    stm32h7串口dma发送_串口通信流程我们知道DM368有两个串口,UART0和UART1。但是UART0默认为调试串口,也就是说一般不用这个作为通信串口,此刻UART1就成为了DM368和上位机通信的唯一选择。官方文档表明,UART0和UART1都已经配置好了,并且不需要修改任何代码就可以直接使用,但是实际操作过程中,保证通信程序完全没有问题的情况下,并不能完成通信。这就让我不得不怀疑,UART1是不是确确实实的使能了?到底是可

    2022年8月13日
    3
  • 算法学习网站推荐

    算法学习网站推荐博主最近在学算法,看了很多不错的文章,顺便推荐几个写的不错的网站~我会慢慢更新1、基础算法学习清单~2、基础的数据结构!3、杂七杂八的算法学习~(这位博主写的东西很杂但是还是不错的)4、ACM习题!5、约瑟夫环问题~(简单的问题也有非常巧妙的解法,这位博主改的一个优化算法非常有意思)6.、A*算法7、LeetCode(这个应该大家都知道,刷题网站)8、我个人g…

    2022年6月19日
    67
  • mysql自定义函数详解_java eval函数

    mysql自定义函数详解_java eval函数存储函数创建存储函数,需要使用CREATEFUNCTION语句,基本语法如下:CREATEFUNCTIONfunc_name([func_parameter])RETURNSTYPE[characteristics…]routine_bodyCREATEFUNCTION为用来创建存储函数的关键字;func_name表示存储函数的名称func_parameter为存储函数的参数列表,参…

    2022年9月8日
    0
  • java 反编译器_java 反编译器

    java 反编译器_java 反编译器xjad反编译工具下载使用反编译时把class文件直接拖拽至工具内即可,如果反编译结果不对时把class文件重新去拿原始的不要编辑打开,或者放在一个文件夹内在试。反编译后的代码没有注释、注解等,反正能用得细心看看调整。点击下载工具http://a.xzfile.com/down2/XJadfanbinayi_downcc.zip…

    2022年8月19日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号