ViewPager左右无限循环

本文介绍了一种基于ViewPager的无限循环加载方案,通过设置大量虚拟页面并调整初始位置,实现流畅的左右滑动体验。同时解决了单击页签时可能出现的View为空的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人项目需要做到完美的左右可以循环的加载的ViewPager。一开始很快实现了无限循环。但是单个点击页签时有时会出现View为空的情况。分析可知是由于你当前要加载的View被清除的缘故。因为事实上ViewPager只缓存了3个元素这是为了你拖动能看到下一个考虑的。所以我做了改动。不说了搞了几个小时才调好。分享给大家吧:

package com.hanwei.spoof.who;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
/**
 * Tab椤甸潰鎵嬪娍婊戝姩鍒囨崲浠ュ強鍔ㄧ敾鏁堟灉
 * 
 * @author D.Winter
 * 
 */
public class SpoofWhoActivity extends Activity {
	//
	private ViewPager mPager;
	private List<View> listViews; 
	private ImageView cursor;
	private TextView t1, t2, t3;
	private int offset = 0;
	private int bmpW;
	int currIndex;
	Matrix matrix;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		matrix=new Matrix();
		InitImageView();
		InitTextView();
		InitViewPager();
	}

	/**
	 * 鍒濆鍖栧ご鏍�	 */
	private void InitTextView() {
		t1 = (TextView) findViewById(R.id.text1);
		t2 = (TextView) findViewById(R.id.text2);
		t3 = (TextView) findViewById(R.id.text3);

		t1.setOnClickListener(new MyOnClickListener(0));
		t2.setOnClickListener(new MyOnClickListener(1));
		t3.setOnClickListener(new MyOnClickListener(2));
	}

	/**
	 * 鍒濆鍖朧iewPager
	 */
	private void InitViewPager() {
		mPager = (ViewPager) findViewById(R.id.vPager);
		listViews = new ArrayList<View>();
		LayoutInflater mInflater = getLayoutInflater();
		listViews.add(mInflater.inflate(R.layout.lay1, null));
		listViews.add(mInflater.inflate(R.layout.lay2, null));
		listViews.add(mInflater.inflate(R.layout.lay3, null));
		mPager.setAdapter(new MyPagerAdapter(listViews));
		mPager.setCurrentItem(498);
		currIndex=498;
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
	}

	/**
	 * 鍒濆鍖栧姩鐢�	 */
	private void InitImageView() {
		cursor = (ImageView) findViewById(R.id.image); 
		bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)	
				.getWidth();
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		int screenW = dm.widthPixels;
		offset = (screenW / 3 - bmpW) / 2;
		matrix.postTranslate(offset, cursor.getTop());
		cursor.setImageMatrix(matrix);
	}

	/**
	 * ViewPager閫傞厤鍣�	 */
	public class MyPagerAdapter extends PagerAdapter {
		public List<View> mListViews;

		public MyPagerAdapter(List<View> mListViews) {
			this.mListViews = mListViews;
		}

	

		@Override
		public void finishUpdate(View arg0) {
		}
		

		@Override
		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
		}

		@Override
		public int getCount() {
			return 1000;
		}

		@Override
		public Object instantiateItem(View arg0, int arg1) {
			System.out.println("DDDDDD++++"+arg1+"DDDDDDDDDD"+((ViewPager) arg0).getChildCount());
			if(((ViewPager) arg0).getChildCount()==3)
			{
				((ViewPager) arg0).removeView(mListViews.get(arg1%3));
			}
	        ((ViewPager) arg0).addView(mListViews.get(arg1%3), 0);

			return mListViews.get(arg1%3);
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == (arg1);
		}

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {
		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View arg0) {
		}



		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			// TODO Auto-generated method stub
			
		}
	}

	/**
	 * 澶存爣鐐瑰嚮鐩戝惉
	 */
	public class MyOnClickListener implements View.OnClickListener {
		private int index = 0;

		public MyOnClickListener(int i) {
			index = i;
		}

		@Override
		public void onClick(View v) {
			int prePos=currIndex-1;
			int nextPos=currIndex+1;
			if(prePos%3==index)
			{
				mPager.setCurrentItem(prePos);
			}
			else
				if(nextPos%3==index)
				{
					mPager.setCurrentItem(nextPos);
				}
				else
						if(currIndex%3==index)
						{
							mPager.setCurrentItem(currIndex);
						}
		}
	};

	/**
	 * 椤靛崱鍒囨崲鐩戝惉
	 */
	public class MyOnPageChangeListener implements OnPageChangeListener {

		int one = offset * 2 + bmpW;
		int two = one * 2;
		@Override
		public void onPageSelected(int arg0) {
			Animation animation = null;
			currIndex = currIndex%3;
			switch (arg0%3) {
			case 0:
				if (currIndex == 1) {
					animation = new TranslateAnimation(one, 0, 0, 0);
				} else if (currIndex == 2) {
					animation = new TranslateAnimation(two, 0, 0, 0);
				}
				break;
			case 1:
				if (currIndex == 0) {
					animation = new TranslateAnimation(offset, one, 0, 0);
				} else if (currIndex == 2) {
					animation = new TranslateAnimation(two, one, 0, 0);
				}
				break;
			case 2:
				if (currIndex == 0) {
					animation = new TranslateAnimation(offset, two, 0, 0);
				} else if (currIndex == 1) {
					animation = new TranslateAnimation(one, two, 0, 0);
				}
				break;
			}
			currIndex = arg0;
			if(animation!=null)
			{
				animation.setFillAfter(true);
				animation.setDuration(300);
				cursor.startAnimation(animation);
			}
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
		}
	}
}

 无限循环的原理是:设置尽量多的元素总数比如1000等等。然后把初始位置设为500或者更多。这样其实是假的无限循环但是用户不会左滑500次吧如果他真的做到了的话好吧他赢了,他可以到我这来领500块钱了哈。还有就是在每次加载View的时候先要清除因为相同的View不能有两个parent。点击无错是根据当前的位置判断的。因为你要知道当前位置和它前面和后面的元素都不是空的所以没有问题的。

 

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值