ViewPager轮播图自动无限循环滑动,手指按住停止滑动


ViewPager轮播图是很常见的功能了,但是项目总是用到,总结下加强记忆.

以下用到的都是再我公司的项目中抽取出来的

1,首先是adapter

这里有两点:

a,getCount()的返回值是Integer.MAX_VALUE;

b,instantiateItem使用到的位置是position % _myList.size();


package com.teekart.app.travel;

import im.yixin.sdk.util.BitmapUtil;

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

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

import com.lidroid.xutils.BitmapUtils;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.teekart.app.R;
import com.teekart.app.beans.QueryProductsInfo.Msg.ProductMsg;
import com.teekart.app.bookcourse.OpenBigPicActivity;

class PicPagerAdapter extends PagerAdapter {

	private ArrayList<String> _myList;
	private Context context;
	private ImageLoader imageLoader;
	private DisplayImageOptions options;

	public PicPagerAdapter(Context context ,ArrayList<String> myList) {
		imageLoader = ImageLoader.getInstance();
		options = new DisplayImageOptions.Builder()
		.showImageForEmptyUri(R.drawable.list_placeholder)
		.showImageOnFail(R.drawable.list_placeholder)
		.resetViewBeforeLoading(true).cacheOnDisk(true)
		.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
		.bitmapConfig(Bitmap.Config.RGB_565).considerExifParams(true)
		.displayer(new FadeInBitmapDisplayer(300))
		.bitmapConfig(Bitmap.Config.RGB_565)
		.imageScaleType(ImageScaleType.IN_SAMPLE_INT).build();
		_myList = myList;
		this.context = context;
	}

	@Override
	public int getCount() {
//		return _myList.size();
		return Integer.MAX_VALUE;
	}

	/**
	 * 判断是否可以复用条目
	 */
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;

	}

	/**
	 * 销毁条目
	 */
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView((View) object);
	}

	/**
	 * 初始化条目
	 */
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		ImageView imageView = new ImageView(context);
		imageView.setScaleType(ScaleType.CENTER_CROP);
		imageView.setTag(position);
		imageView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
			int position=(Integer) v.getTag();
			Intent intent=new Intent(context,OpenBigPicActivity.class);
			intent.putExtra("position", position);
			intent.putExtra("urlList", _myList);
			context.startActivity(intent);
			}
		});
		
		imageLoader.displayImage(_myList.get(position % _myList.size()), imageView, options);
//		imageLoader.displayImage(_myList.get(position), imageView, options);
		// 1. 将要显示的界面加到容器中
		container.addView(imageView);

		// 2. 返回给控制器, 执行super方法会报错
		return imageView;
	}

}


2,添加顶部banner图.

/**
	 * 添加顶部的banner图
	 */
	private void addTopPic() {
	
		topImglist = new ArrayList<String>();
		topImglist = travelDetailInfo.topGallerys;

		ArrayList<ImageView> mListData = new ArrayList<ImageView>();
		ImageView iv;
		for (int i = 0; i < topImglist.size(); i++) {
			iv = new ImageView(this);
			imageLoader.displayImage(topImglist.get(i), iv,options);
//			BitmapUtils bitmapUtil = new BitmapUtils(this);
//			bitmapUtil.display(iv, topImglist.get(i));
			mListData.add(iv);

		}

		vp_travel.setAdapter(new PicPagerAdapter(this, topImglist));
		tv_page.setText(1+"/"+topImglist.size());
		vp_travel.setOnPageChangeListener(new OnPageChangeListener() {
			@Override
			public void onPageSelected(int position) {
				 int previousSelectPosition = position  % topImglist.size();;
				tv_page.setText(previousSelectPosition+1+"/"+topImglist.size());
//				tv_page.setText(position+1+"/"+topImglist.size());
			}

			@Override
			public void onPageScrollStateChanged(int state) {
			}

			@Override
			public void onPageScrolled(int position, float positionOffset,
					int positionOffsetPixels) {
			}

		});
		vp_travel.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
//				case MotionEvent.ACTION_DOWN:
//					System.out.println("ddddddddddddd");
//					toloop = false;
//					break;
				case MotionEvent.ACTION_MOVE:
					System.out.println("mmmmmmmmmm");
					toloop = false;
					break;
				case MotionEvent.ACTION_UP:
					System.out.println("uuuuuuuuuuuuuuuuuuuu");
					toloop = true;
					break;

				default:
					break;
				}
				
				return false;
			}
		});
	}



3,自动切换功能实现并设置当前位置

private void setTopImgGo() {
		// 自动切换页面功能  
       new Thread(new Runnable() {  
 
       

		@Override  
           public void run() {  
               while (isLoop) {  
                   SystemClock.sleep(3000);  
                   if (toloop) {
                	   handler.sendEmptyMessage(0);  
                   }
               }  
           }  
       }).start();  
       /** 
        * 2147483647 / 2 = 1073741820 - 1  
        * 设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动 
        */  
       int n = Integer.MAX_VALUE / 2 % topImglist.size();  
       int itemPosition = Integer.MAX_VALUE / 2 - n;  
         
       vp_travel.setCurrentItem(itemPosition);
	}


4,最后效果图








  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是在Android Viewpager轮播图中前后各添加一个页面,实现无限手动滑动的完整代码: 1. 首先,在布局文件中添加ViewPager控件: ``` <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 2. 在Activity或Fragment中获取ViewPager控件,并设置适配器和监听器: ``` ViewPager viewPager = findViewById(R.id.viewPager); ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), imageList); viewPager.setAdapter(adapter); viewPager.setCurrentItem(1); // 设置ViewPager初始显示的页面为第二个页面 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // 当滑动到第一个或最后一个页面时,自动跳转到对应的最后一个或第一个页面 if (position == 0) { viewPager.setCurrentItem(imageList.size() - 2, false); } else if (position == imageList.size() - 1) { viewPager.setCurrentItem(1, false); } } @Override public void onPageScrollStateChanged(int state) { } }); ``` 3. 创建适配器ViewPagerAdapter,并重写其getItemCount()和getItemPosition()方法: ``` private class ViewPagerAdapter extends FragmentPagerAdapter { private List<String> mList; public ViewPagerAdapter(FragmentManager fm, List<String> list) { super(fm); this.mList = list; } @Override public Fragment getItem(int position) { return ImageFragment.newInstance(mList.get(position)); } @Override public int getCount() { return mList.size() + 2; // 在ViewPager前后各添加一个页面 } @Override public int getItemPosition(@NonNull Object object) { return POSITION_NONE; // 当页面刷新时,所有页面都会被重新加载 } } ``` 4. 创建Fragment类ImageFragment,并在其布局文件中添加ImageView控件: ``` public class ImageFragment extends Fragment { private static final String ARG_IMAGE_URL = "image_url"; private String mImageUrl; public ImageFragment() { // Required empty public constructor } public static ImageFragment newInstance(String imageUrl) { ImageFragment fragment = new ImageFragment(); Bundle args = new Bundle(); args.putString(ARG_IMAGE_URL, imageUrl); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mImageUrl = getArguments().getString(ARG_IMAGE_URL); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_image, container, false); ImageView imageView = view.findViewById(R.id.imageView); Glide.with(this).load(mImageUrl).into(imageView); return view; } } ``` 5. 最后,在AndroidManifest.xml文件中添加网络权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 至此,Android Viewpager轮播图在前后各添加一个页面实现无限手动滑动的代码就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值