ViewPager轮播滑动白屏和自动播放速度变快原因

今天,这里我们解决ViewPager的2个问题

Issue1:ViewPgaer在实现轮播效果时出现白屏的问题

Issue2:ViewPager在实现轮播效果时随着操作的次数变多轮播速度变快的问题

解决方法:对于第一种问题,我们定位的问题点是数据的问题,在原生组件ViewPager上,当轮播的view少于3张时就会出现这样的情况,针对这样的情况,很多人也是表示很无奈,所以,我们的应对方法就是将数据add成双份,这样就解决了这类白屏的问题了;而第二种问题,我们定位在执行了耗时操作(此处默认使用Handler),但是执行前没有清除滑动消息,导致动画错乱,进而出现轮播变快现象。代码如下:

private HomePagerAdapter adapter;
private List<View> mLists = new ArrayList<View>();
private List<String> imgUrlList = new ArrayList<>();//轮播图图片url
//... ...
//这里我们省略了很多,下面的操作是在请求接口成功后调用
imgUrlList.clear();//清空数据
if (null!= modelBean.getData().getAdvertBeans() && modelBean.getData().getAdvertBeans().size()>0){//轮播图个数的循环限制(循环添加用以解决白屏问题)
if (modelBean.getData().getAdvertBeans().size() == 1){
                                            for (int i = 0; i < 4; i++) {
                                                initSetData(0,modelBean);
                                            }
                                        }else if (modelBean.getData().getAdvertBeans().size() == 2){
                                            for (int i = 0; i < 4; i++) {
                                                initSetData(i%2,modelBean);
                                            }
                                        }else if (modelBean.getData().getAdvertBeans().size() == 3){
                                            for (int i = 0; i < 6; i++) {
                                                initSetData(i%3,modelBean);
                                            }
                                        }else {
                                            for (int i = 0; i < modelBean.getData().getAdvertBeans().size(); i++) {
                                                initSetData(i,modelBean);
                                            }
                                        }

}

initFlashView(modelBean);//轮播图的切换


//几个方法
 private void initSetData(int i, HomeBean modelBean) {
        for (i = 0; i < modelBean.getData().getAdvertBeans().size(); i++) {
            if (null!= modelBean.getData().getAdvertBeans().get(i) && null!= modelBean.getData().getAdvertBeans().get(i).getAdPicUrl()){
                imgUrlList.add(modelBean.getData().getAdvertBeans().get(i).getAdPicUrl());
            }else {
                imgUrlList.add("");
            }
        }
}

private void initFlashView(HomeBean modelBean) {
        mLists.clear();
        if (imgUrlList.size()>0){
            for (int i = 0; i < imgUrlList.size(); i++) {
                ImageView iv = new ImageView(getActivity());
                ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                iv.setLayoutParams(lp);
                //根据下标获取实际的图片
                Picasso.with(getActivity()).load(imgUrlList.get(i)).error(R.mipmap.default_image).into(iv);
                iv.setScaleType(ImageView.ScaleType.FIT_XY);
                mLists.add(iv);
            }
        }

//轮播图的adapter
    if (null == adapter){
            adapter = new HomePagerAdapter(mLists, mItemClickListener);
            viewPagerHome.setAdapter(adapter);
        }else {
            adapter.notifyDataSetChanged();
        }
    }
}


//轮播跳转
    HomePagerAdapter.OnItemClickListener mItemClickListener = new HomePagerAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            Intent intent = new Intent(getActivity(),AdPicHomeJumpActivity.class);
            if (imgJumpUrlList.size()>0 && null!= imgJumpUrlList.get(position)){
                intent.putExtra("jumpUrl",imgJumpUrlList.get(position));
            }
            getActivity().startActivity(intent);
        }
    };
到这里,我们可能会发现轮播不能跳转,那么,我们接下来要做的就是在onCreate()方法中接口调用后执行方法initView(),代码如下:
    @ViewInject(R.id.viewpager_home)
    ViewPager viewPagerHome;

    private final int HOME_AD_RESULT = 1;//轮播

   @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getHomeData();//接口调用方法

        initView();
    }
    private void initView() {
        //开启线程循环播放轮播
        try {
            viewPagerHome.setCurrentItem(50000);
        }catch (Exception e){
            e.printStackTrace();
        }

        mHandler.removeMessages(HOME_AD_RESULT);//此方法必须写,不然会出现issue2的现象,操作越多,轮播播放速度越快
        mHandler.sendEmptyMessageDelayed(HOME_AD_RESULT, 3000);
    }


 private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case HOME_AD_RESULT:
                    //这里是设置当前页的下一页
                    viewPagerHome.setCurrentItem(viewPagerHome.getCurrentItem() + 1);
                    mHandler.removeMessages(HOME_AD_RESULT);
                    mHandler.sendEmptyMessageDelayed(HOME_AD_RESULT, 3000);
                    break;
                default:
                    break;
            }

        }
    };

到这里,我们的分析基本结束,仅记录供参考!

如有问题,欢迎留言!

这里写图片描述

猜你喜欢

转载自blog.csdn.net/dota_wy/article/details/80020977