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

来源:互联网 发布:c语言写俄罗斯方块 编辑:程序博客网 时间:2024/05/18 00:47

转载自:http://blog.csdn.net/kpioneer123/article/details/51121550

本demo 实现以下功能

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

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



基本思路

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

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

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


[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.cloudhome.viewpagerproject;  
  2.   
  3. import android.os.Bundle;  
  4. import android.os.Message;  
  5. import android.support.design.widget.FloatingActionButton;  
  6. import android.support.design.widget.Snackbar;  
  7. import android.support.v4.view.PagerAdapter;  
  8. import android.support.v4.view.ViewPager;  
  9. import android.support.v7.app.AppCompatActivity;  
  10. import android.support.v7.widget.Toolbar;  
  11. import android.view.Gravity;  
  12. import android.view.Menu;  
  13. import android.view.MenuItem;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16. import android.view.ViewParent;  
  17. import android.widget.ImageView;  
  18. import android.widget.LinearLayout;  
  19.   
  20. import com.android.volley.toolbox.NetworkImageView;  
  21.   
  22. import java.lang.ref.WeakReference;  
  23. import java.util.ArrayList;  
  24. import java.util.List;  
  25.   
  26.   
  27. public class MainActivity extends AppCompatActivity {  
  28.     public InsuranceShop_ImageHandler InsuranceShop_handler = new InsuranceShop_ImageHandler(  
  29.             new WeakReference<MainActivity>(this));  
  30.     public ViewPager insurbanner;  
  31.     ArrayList<NetworkImageView> newImageViews;  
  32.     private NetworkImageView networkImageView;  
  33.     private ViewGroup group; // 图中小圆点Group  
  34.     private ImageView[] imageDots = null// 小圆点数组集合  
  35.     private ImageView view;  
  36.     private ImageAdapter imageAdapter;  
  37.     private List<HeadImage> imageLists = new ArrayList<HeadImage>();  
  38.     private List<HeadImage> imageList_orginal = new ArrayList<HeadImage>();  
  39.     private  int currentPosition =0;  
  40.   
  41.     @Override  
  42.     protected void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.activity_main);  
  45.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);  
  46.         setSupportActionBar(toolbar);  
  47.   
  48.         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);  
  49.         fab.setOnClickListener(new View.OnClickListener() {  
  50.             @Override  
  51.             public void onClick(View view) {  
  52.                 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)  
  53.                         .setAction("Action"null).show();  
  54.             }  
  55.         });  
  56.   
  57.         initviewPage_img();  
  58.     }  
  59.   
  60.   
  61.     public void initviewPage_img() {  
  62.   
  63.   
  64.         HeadImage headImage_suoluetu1 = new HeadImage();  
  65.         HeadImage headImage_suoluetu2 = new HeadImage();  
  66.         HeadImage headImage_suoluetu3 = new HeadImage();  
  67.         HeadImage headImage_suoluetu4 = new HeadImage();  
  68.         HeadImage headImage_suoluetu5 = new HeadImage();  
  69.   
  70.   
  71.         headImage_suoluetu1  
  72.                 .setIndexImgurl("http://i1.sinaimg.cn/gm/cr/2015/0413/1065544739.jpg");  
  73.         headImage_suoluetu2  
  74.                 .setIndexImgurl("http://pic.58pic.com/58pic/12/81/24/81S58PICjnb.jpg");  
  75.         headImage_suoluetu3  
  76.                 .setIndexImgurl("http://d.3987.com/qingx_150213/001.jpg");  
  77.         headImage_suoluetu4  
  78.                 .setIndexImgurl("http://img3.imgtn.bdimg.com/it/u=2581234383,1952951452&fm=21&gp=0.jpg");  
  79.         headImage_suoluetu5  
  80.                 .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");  
  81.   
  82.   
  83.         // 正常情况下 图片List 通过 msg—handle机制获取,这里为了方便 直接数据写死  
  84.   
  85.         // List<HeadImage> imageLists = (List<HeadImage>) msg.obj;  
  86.   
  87.   
  88.         //在这里可以依次添加1到n个图片测试  
  89.         imageList_orginal.add(headImage_suoluetu1);  
  90.         imageList_orginal.add(headImage_suoluetu2);  
  91. //        imageList_orginal.add(headImage_suoluetu3);  
  92. //        imageList_orginal.add(headImage_suoluetu4);  
  93.         //  imageLists.add(headImage_suoluetu5);  
  94.   
  95.   
  96.         initviewPage();  
  97.   
  98.   
  99.         newImageViews = new ArrayList<NetworkImageView>();  
  100.   
  101.   
  102.         switch (imageList_orginal.size()) {  
  103.   
  104.             case 2:  
  105.   
  106.                 imageLists.add(imageList_orginal.get(0));  
  107.                 imageLists.add(imageList_orginal.get(1));  
  108.                 imageLists.add(imageList_orginal.get(0));  
  109.                 imageLists.add(imageList_orginal.get(1));  
  110.   
  111.   
  112.                 break;  
  113.   
  114.             default:  
  115.                 imageLists = imageList_orginal;  
  116.   
  117.                 break;  
  118.   
  119.         }  
  120.   
  121.         for (int i = 0; i < imageLists.size(); i++) {  
  122.             networkImageView = new NetworkImageView(  
  123.                     MainActivity.this);  
  124.   
  125.   
  126.             networkImageView.setScaleType(ImageView.ScaleType.FIT_XY);  
  127.             networkImageView.setDefaultImageResId(R.mipmap.white_bg);  
  128.             networkImageView.setImageUrl(imageLists.get(i)  
  129.                             .getIndexImgurl(),  
  130.                     VolleyTool.getInstance(MainActivity.this)  
  131.                             .getmImageLoader());  
  132.   
  133.             newImageViews.add(networkImageView);  
  134.   
  135.         }  
  136.   
  137.         group.removeAllViews();  
  138.         imageDots = new ImageView[imageList_orginal.size()];// 小点个数  
  139.         for (int i = 0; i < imageDots.length; i++) {  
  140.             imageDots[i] = new ImageView(MainActivity.this);  
  141.             // 设置参数  
  142.             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(2020);  
  143.             params.gravity = Gravity.CENTER_HORIZONTAL;  
  144.             params.setMargins(6060);  
  145.             imageDots[i].setLayoutParams(params);  
  146.             imageDots[i].setPadding(200200);  
  147.             if (i == 0) {  
  148.                 imageDots[i]  
  149.                         .setBackgroundResource(R.mipmap.white_piont_icon);  
  150.             } else {  
  151.                 imageDots[i]  
  152.                         .setBackgroundResource(R.mipmap.gray_piont_icon);  
  153.             }  
  154.             group.addView(imageDots[i]);  
  155.         }  
  156.   
  157.         imageAdapter = new ImageAdapter(newImageViews);  
  158.         insurbanner.setAdapter(imageAdapter);  
  159.         imageAdapter.notifyDataSetChanged();  
  160.     }  
  161.   
  162.   
  163.     public void initviewPage() {  
  164.   
  165.         insurbanner = (ViewPager) findViewById(R.id.insurbanner);  
  166.         group = (ViewGroup) findViewById(R.id.point_group);  
  167.   
  168.         insurbanner.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
  169.   
  170.             // 配合Adapter的currentItem字段进行设置。  
  171.             @Override  
  172.             public void onPageSelected(int arg0) {  
  173.                 InsuranceShop_handler.sendMessage(Message.obtain(  
  174.                         InsuranceShop_handler,  
  175.                         InsuranceShop_ImageHandler.MSG_PAGE_CHANGED,  
  176.                         arg0, 0));  
  177.   
  178.                  currentPosition = arg0 % imageList_orginal.size();  
  179.                 for (int i = 0; i < imageList_orginal.size(); i++) {  
  180.                     imageDots[currentPosition]  
  181.                             .setBackgroundResource(R.mipmap.white_piont_icon);  
  182.                     if (currentPosition != i) {  
  183.                         imageDots[i]  
  184.                                 .setBackgroundResource(R.mipmap.gray_piont_icon);  
  185.                     }  
  186.                 }  
  187.             }  
  188.   
  189.             @Override  
  190.             public void onPageScrolled(int arg0, float arg1, int arg2) {  
  191.             }  
  192.   
  193.             // 覆写该方法实现轮播效果的暂停和恢复  
  194.             @Override  
  195.             public void onPageScrollStateChanged(int arg0) {  
  196.   
  197.   
  198.                 if (imageList_orginal.size() != 1 && imageList_orginal.size() > 1) {  
  199.                     switch (arg0) {  
  200.   
  201.   
  202.                         case ViewPager.SCROLL_STATE_DRAGGING:  
  203.                             InsuranceShop_handler  
  204.                                     .sendEmptyMessage(InsuranceShop_ImageHandler.MSG_KEEP_SILENT);  
  205.   
  206.                             break;  
  207.                         case ViewPager.SCROLL_STATE_IDLE:  
  208.                             InsuranceShop_handler  
  209.                                     .sendEmptyMessageDelayed(  
  210.                                             InsuranceShop_ImageHandler.MSG_UPDATE_IMAGE,  
  211.                                             InsuranceShop_ImageHandler.MSG_DELAY);  
  212.                             break;  
  213.   
  214.   
  215.                         default:  
  216.                             break;  
  217.                     }  
  218.                 }  
  219.             }  
  220.         });  
  221.         insurbanner.setCurrentItem(Integer.MAX_VALUE / 2);// 默认在中间,使用户看不到边界  
  222.         // 开始轮播效果  
  223.         InsuranceShop_handler.sendEmptyMessageDelayed(  
  224.                 InsuranceShop_ImageHandler.MSG_BREAK_SILENT,  
  225.                 InsuranceShop_ImageHandler.MSG_DELAY);  
  226.   
  227.     }  
  228.   
  229.     @Override  
  230.     public boolean onCreateOptionsMenu(Menu menu) {  
  231.         // Inflate the menu; this adds items to the action bar if it is present.  
  232.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  233.         return true;  
  234.     }  
  235.   
  236.     @Override  
  237.     public boolean onOptionsItemSelected(MenuItem item) {  
  238.         // Handle action bar item clicks here. The action bar will  
  239.         // automatically handle clicks on the Home/Up button, so long  
  240.         // as you specify a parent activity in AndroidManifest.xml.  
  241.         int id = item.getItemId();  
  242.   
  243.         //noinspection SimplifiableIfStatement  
  244.         if (id == R.id.action_settings) {  
  245.             return true;  
  246.         }  
  247.   
  248.         return super.onOptionsItemSelected(item);  
  249.     }  
  250.   
  251.     public class ImageAdapter extends PagerAdapter {  
  252.   
  253.         private ArrayList<NetworkImageView> viewlist;  
  254.   
  255.         public ImageAdapter(ArrayList<NetworkImageView> viewlist) {  
  256.             this.viewlist = viewlist;  
  257.         }  
  258.   
  259.         @Override  
  260.         public int getCount() {  
  261.             // 设置成最大,使用户看不到边界  
  262.   
  263.             if (viewlist.size() == 1) {  
  264.                 return 1;  
  265.             } else {  
  266.                 return Integer.MAX_VALUE;  
  267.             }  
  268.         }  
  269.   
  270.         @Override  
  271.         public boolean isViewFromObject(View arg0, Object arg1) {  
  272.             return arg0 == arg1;  
  273.         }  
  274.   
  275.         @Override  
  276.         public void destroyItem(ViewGroup container, int position, Object object) {  
  277.             // Warning:不要在这里调用removeView  
  278.   
  279.         }  
  280.   
  281.         @Override  
  282.         public Object instantiateItem(ViewGroup container, int position) {  
  283.   
  284.             // 对ViewPager页号求模取出View列表中要显示的项  
  285.             position %= viewlist.size();  
  286.   
  287.             if (position < 0) {  
  288.                 position = viewlist.size() + position;  
  289.             }  
  290.   
  291.             view = viewlist.get(position);  
  292.   
  293.             // 如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。  
  294.             ViewParent vp = view.getParent();  
  295.             if (vp != null) {  
  296.                 ViewGroup parent = (ViewGroup) vp;  
  297.                 parent.removeView(view);  
  298.             }  
  299.   
  300.             final String abc = imageLists.get(position).getIndexImgurl();  
  301.   
  302.             
  303.             view.setOnClickListener(new View.OnClickListener() {  
  304.   
  305.                 @Override  
  306.                 public void onClick(View arg0) {  
  307.   
  308.                 final   String  bannerid = bannerlist.get(currentPosition).get("id").toString();  
  309.         final   String  banner_title = bannerlist.get(currentPosition).get("scene_name")  
  310.                             .toString();  
  311.         Intent intent = new Intent();  
  312.         intent.putExtra("bannerid", bannerid);  
  313.         intent.putExtra("banner_title", banner_title);  
  314.         intent.setClass(InsuranceShopActivity.this,In_ShopSceneProductsActivity.class);  
  315.                     InsuranceShopActivity.this.startActivity(intent);  
  316.   
  317.   
  318.                 }  
  319.             });  
  320.   
  321.             container.addView(view, 0);  
  322.   
  323.             return view;  
  324.         }  
  325.   
  326.     }  
  327. }  


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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. final   String  bannerid = bannerlist.get(currentPosition).get("id").toString();  
  2.         final   String  banner_title = bannerlist.get(currentPosition).get("scene_name")  
  3.                             .toString();  


           

资源下载(下载demo后请按照blog注意事项修改)
0 0
原创粉丝点击