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

本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; // 图中小圆点Group
    private 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;

    @Override
    protected 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() {
            @Override
            public 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字段进行设置。
            @Override
            public 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);
                    }
                }
            }

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

            // 覆写该方法实现轮播效果的暂停和恢复
            @Override
            public 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);

    }

    @Override
    public 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;
    }

    @Override
    public 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 SimplifiableIfStatement
        if (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;
        }

        @Override
        public int getCount() {
            // 设置成最大,使用户看不到边界

            if (viewlist.size() == 1) {
                return 1;
            } else {
                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) {
            // Warning:不要在这里调用removeView

        }

        @Override
        public 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() {

                @Override
                public 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注意事项修改)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值