本demo 实现以下功能

1、页面数=1时,页面静止;

2、页面数=>2时,页面滑动不会产生空白

基本思路

当图片数量为1的时候,不让滑动,

当图片数量为2的时候,按原图片顺序再依次添加,图片数翻倍变为4,防止出现空白页,但是轮播点的个数依然写为2,这样就可以完美解决。

当图片数量为n>2的时候,按照常规写法即可。

package com.cloudhome.viewpagerproject;import android.os.Bundle;
import android.os.Message;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.LinearLayout;import com.android.volley.toolbox.NetworkImageView;import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {public InsuranceShop_ImageHandler InsuranceShop_handler = new InsuranceShop_ImageHandler(new WeakReference<MainActivity>(this));public ViewPager insurbanner;ArrayList<NetworkImageView> newImageViews;private NetworkImageView networkImageView;private ViewGroup group; // 图中小圆点Groupprivate ImageView[] imageDots = null; // 小圆点数组集合private ImageView view;private ImageAdapter imageAdapter;private List<HeadImage> imageLists = new ArrayList<HeadImage>();private List<HeadImage> imageList_orginal = new ArrayList<HeadImage>();private  int currentPosition =0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();}});initviewPage_img();}public void initviewPage_img() {HeadImage headImage_suoluetu1 = new HeadImage();HeadImage headImage_suoluetu2 = new HeadImage();HeadImage headImage_suoluetu3 = new HeadImage();HeadImage headImage_suoluetu4 = new HeadImage();HeadImage headImage_suoluetu5 = new HeadImage();headImage_suoluetu1.setIndexImgurl("http://i1.sinaimg.cn/gm/cr/2015/0413/1065544739.jpg");headImage_suoluetu2.setIndexImgurl("http://pic.58pic.com/58pic/12/81/24/81S58PICjnb.jpg");headImage_suoluetu3.setIndexImgurl("http://d.3987.com/qingx_150213/001.jpg");headImage_suoluetu4.setIndexImgurl("http://img3.imgtn.bdimg.com/it/u=2581234383,1952951452&fm=21&gp=0.jpg");headImage_suoluetu5.setIndexImgurl("http://image.baidu.com/search/detail?ct=503316480&z=1&tn=baiduimagedetail&ipn=d&word=%E9%A3%8E%E6%99%AF%20%E5%B0%8F%E5%B0%BA%E5%AF%B8&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=-1&cs=1808999674,2935367553&os=3410395349,124291932&simid=4178998595,794777276&pn=1&rn=1&di=123285481110&ln=1968&fr=&fmq=1460351344815_R&ic=0&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&is=&istype=2&ist=&jit=&bdtype=0&gsm=78&objurl=http%3A%2F%2Fimg.daimg.com%2Fuploads%2Fallimg%2F111111%2F3-11111116430K10.jpg");// 正常情况下 图片List 通过 msg—handle机制获取,这里为了方便 直接数据写死// List<HeadImage> imageLists = (List<HeadImage>) msg.obj;//在这里可以依次添加1到n个图片测试imageList_orginal.add(headImage_suoluetu1);imageList_orginal.add(headImage_suoluetu2);
//        imageList_orginal.add(headImage_suoluetu3);
//        imageList_orginal.add(headImage_suoluetu4);//  imageLists.add(headImage_suoluetu5);initviewPage();newImageViews = new ArrayList<NetworkImageView>();switch (imageList_orginal.size()) {case 2:imageLists.add(imageList_orginal.get(0));imageLists.add(imageList_orginal.get(1));imageLists.add(imageList_orginal.get(0));imageLists.add(imageList_orginal.get(1));break;default:imageLists = imageList_orginal;break;}for (int i = 0; i < imageLists.size(); i++) {networkImageView = new NetworkImageView(MainActivity.this);networkImageView.setScaleType(ImageView.ScaleType.FIT_XY);networkImageView.setDefaultImageResId(R.mipmap.white_bg);networkImageView.setImageUrl(imageLists.get(i).getIndexImgurl(),VolleyTool.getInstance(MainActivity.this).getmImageLoader());newImageViews.add(networkImageView);}group.removeAllViews();imageDots = new ImageView[imageList_orginal.size()];// 小点个数for (int i = 0; i < imageDots.length; i++) {imageDots[i] = new ImageView(MainActivity.this);// 设置参数LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);params.gravity = Gravity.CENTER_HORIZONTAL;params.setMargins(6, 0, 6, 0);imageDots[i].setLayoutParams(params);imageDots[i].setPadding(20, 0, 20, 0);if (i == 0) {imageDots[i].setBackgroundResource(R.mipmap.white_piont_icon);} else {imageDots[i].setBackgroundResource(R.mipmap.gray_piont_icon);}group.addView(imageDots[i]);}imageAdapter = new ImageAdapter(newImageViews);insurbanner.setAdapter(imageAdapter);imageAdapter.notifyDataSetChanged();}public void initviewPage() {insurbanner = (ViewPager) findViewById(R.id.insurbanner);group = (ViewGroup) findViewById(R.id.point_group);insurbanner.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {// 配合Adapter的currentItem字段进行设置。@Overridepublic void onPageSelected(int arg0) {InsuranceShop_handler.sendMessage(Message.obtain(InsuranceShop_handler,InsuranceShop_ImageHandler.MSG_PAGE_CHANGED,arg0, 0));currentPosition = arg0 % imageList_orginal.size();for (int i = 0; i < imageList_orginal.size(); i++) {imageDots[currentPosition].setBackgroundResource(R.mipmap.white_piont_icon);if (currentPosition != i) {imageDots[i].setBackgroundResource(R.mipmap.gray_piont_icon);}}}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}// 覆写该方法实现轮播效果的暂停和恢复@Overridepublic void onPageScrollStateChanged(int arg0) {if (imageList_orginal.size() != 1 && imageList_orginal.size() > 1) {switch (arg0) {case ViewPager.SCROLL_STATE_DRAGGING:InsuranceShop_handler.sendEmptyMessage(InsuranceShop_ImageHandler.MSG_KEEP_SILENT);break;case ViewPager.SCROLL_STATE_IDLE:InsuranceShop_handler.sendEmptyMessageDelayed(InsuranceShop_ImageHandler.MSG_UPDATE_IMAGE,InsuranceShop_ImageHandler.MSG_DELAY);break;default:break;}}}});insurbanner.setCurrentItem(Integer.MAX_VALUE / 2);// 默认在中间,使用户看不到边界// 开始轮播效果InsuranceShop_handler.sendEmptyMessageDelayed(InsuranceShop_ImageHandler.MSG_BREAK_SILENT,InsuranceShop_ImageHandler.MSG_DELAY);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}public class ImageAdapter extends PagerAdapter {private ArrayList<NetworkImageView> viewlist;public ImageAdapter(ArrayList<NetworkImageView> viewlist) {this.viewlist = viewlist;}@Overridepublic int getCount() {// 设置成最大,使用户看不到边界if (viewlist.size() == 1) {return 1;} else {return Integer.MAX_VALUE;}}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// Warning:不要在这里调用removeView}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// 对ViewPager页号求模取出View列表中要显示的项position %= viewlist.size();if (position < 0) {position = viewlist.size() + position;}view = viewlist.get(position);// 如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。ViewParent vp = view.getParent();if (vp != null) {ViewGroup parent = (ViewGroup) vp;parent.removeView(view);}final String abc = imageLists.get(position).getIndexImgurl();view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {final String  bannerid = bannerlist.get(currentPosition).get("id").toString();final    String  banner_title = bannerlist.get(currentPosition).get("scene_name").toString();Intent intent = new Intent();intent.putExtra("bannerid", bannerid);intent.putExtra("banner_title", banner_title);intent.setClass(InsuranceShopActivity.this,In_ShopSceneProductsActivity.class);InsuranceShopActivity.this.startActivity(intent);}});container.addView(view, 0);return view;}}
}

注意:在onPageSelected 中设置当前currentPosition;在中 ImageAdapter 添加图片点击事件时使用currentPosition

final    String  bannerid = bannerlist.get(currentPosition).get("id").toString();final    String  banner_title = bannerlist.get(currentPosition).get("scene_name").toString();

资源下载(下载demo后请按照blog注意事项修改)

Android解决ViewPager页面滑动空白bug和图片点击bug相关推荐

  1. Android 解决ViewPager双层嵌套的滑动问题

    Android 解决ViewPager双层嵌套的滑动问题 参考文章: (1)Android 解决ViewPager双层嵌套的滑动问题 (2)https://www.cnblogs.com/zhujia ...

  2. android圆球触摸怎么实现,Android利用ViewPager实现带小圆球的图片滑动

    Android利用ViewPager实现带小圆球的图片滑动 发布时间:2020-10-02 05:55:29 来源:脚本之家 阅读:69 作者:antimage08 在上文实现的带小圆球的图片滑动的通 ...

  3. android 禁止Viewpager左右滑动功能

    今天,简单讲讲Android如何禁止Viewpager左右滑动功能. 原理: 百度后发现重写ViewPager,覆盖ViewPager的onInterceptTouchEvent(MotionEven ...

  4. Android中实现页面滑动——ViewPager

    ViewPager可以实现多页面滑动切换以及动画效果,在很多开发场合都十分常用,不仅方便实用而且功能强大.ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他的v ...

  5. Android RecyclerView使用 及 滑动时加载图片优化方案

    1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...

  6. Android 解决ViewPager.setCurrentItem中间很多页面切换问题

    最近项目有个需求是主页包含4个Fragment,但还要求有滑动效果.相信大家第一个就会想到viewPager+fragment进行实现该功能了. 在做完功能后,发现有个问题,就是当我点击底部tab时, ...

  7. android 解决viewpager+多个fragment+recyclerview,viewpager展示内容高度不自适应出现多余空白问题

    一.首先要做的就是重写viewpager public class MyViewPager extends ViewPager {private int current;private int hei ...

  8. Android利用ViewPager实现滑动广告板

    •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其中 ...

  9. android viewpager 滑动方法,Android中Viewpager禁止滑动的实现

    前言 现在很多app,首页不允许滑动切换(因为页面加载吧),但是又用viewpage来管理frgament.因为方便嘛. 以前在网上找的例子: public class NoScrollViewPag ...

最新文章

  1. LeetCode简单题之K 进制表示下的各位数字总和
  2. 【数理知识】《数值分析》李庆扬老师-第6章-解线性方程组的迭代法
  3. Linux主流架构运维工作简单剖析
  4. armgcc交叉编译的文件无法运行_认识GCC交叉编译器
  5. python logging使用_Python实战之logging模块使用详解
  6. Python学习杂记之静态网页学习
  7. MySQL学习之备份
  8. 返回三级联动的JSON数据
  9. Git 使用篇二:搭建远程服务器
  10. Error:java: Compilation failed: internal java compiler error 解决办法
  11. 华为lab-rs-v1-1.5_smart link
  12. AI资源对接需求汇总:第3期
  13. Python win32gui.ShowWindow() 窗口没弹出来解决方法
  14. 2021年挖掘猫眼专业版电影票房数据
  15. 深度学习中IOU的含义
  16. JS前端弹出警示框和提示框
  17. 免屏实现精准较时设定,WT588F02B-8S(C006_03)电子语音药盒解决方案
  18. application中 android:icon 和 android:roundIcon 的区别
  19. 1.2 租车系统(前台+后台)----成果图
  20. 多领域常见的一种NB-IoT温湿度传感器

热门文章

  1. spring-boot、jeecg-boot中解除shiro限制了上传视频文件,以及设置上传文件大小的限制
  2. mysql 1593_Linux中MySQL主从复制中出现1593错误码的低级错误
  3. 【人工智能】人工智能的概况(绪论)
  4. Trajectory Generation of a Quadrotor Transporting a Bulky Payload in the Cluttered Environments 论文解析
  5. 年底买基金的六大建议!
  6. Quartus Prime官方下载方法
  7. Springboot - retry机制简介以及踩过的坑
  8. SAP的统驭科目 - 什么是SAP的统驭科目
  9. 计算机组成原理扩展指令CLC实验报告,惠州学院-计算机组成原理实验四 含流程图...
  10. React Native学习速记