ViewPager的简单优化和实现大图轮播

大图轮播的实现方式就是通过ViewPager实现,然后定时改变ViewPager的setCurrentItem。虽然ViewPager加载几张图片不会导致程序崩溃,但是能优化的地方最好还是优化

代码

public class HomePictureHolder extends BaseHolder<List<String>> {


    private ViewPager viewPager;
    private List<String> datas;

    @Override
    protected void refreshView(List<String> datas) {
        this.datas = datas;
        viewPager.setAdapter(new HomePictureAdapter());
        viewPager.setCurrentItem(1000 * datas.size());

        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        auToRunTask.stop();
                        break;
                    // 事件的取消,即在viewpager按下,不在viewpager松开,会导致不在viewpager松开,viewpager不会自动轮播
                    case MotionEvent.ACTION_CANCEL:
                        auToRunTask.start();
                        break;
                    case MotionEvent.ACTION_UP:
                        auToRunTask.start();
                        break;
                }
                return false;
            }
        });
        auToRunTask = new AuToRunTask();
        auToRunTask.start();
    }

    @Override
    protected View initView() {
        viewPager = new ViewPager(UiUtils.getContext());
        viewPager.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
                (int) UiUtils.getResource().getDimension(R.dimen.itme_app_height)));

        return viewPager;
    }

    private boolean flag;
    private AuToRunTask auToRunTask;

    public class AuToRunTask implements Runnable {
        @Override
        public void run() {
            if (flag) {
                UiUtils.cancel(this);  // 取消之前
                int currentItem = viewPager.getCurrentItem();

                viewPager.setCurrentItem(++currentItem);
                //  延迟执行当前的任务
                UiUtils.postDelayed(this,5000);
            }
        }

        /* 开始自动轮播*/
        public void start(){
            if(!flag){
                UiUtils.cancel(this);
                flag = true;
                UiUtils.postDelayed(this,5000);
            }
        }
        /* 停止自动轮播*/
        public void stop(){
            if(flag){
                UiUtils.cancel(this);
                flag = false;
            }
        }

    }


    class HomePictureAdapter extends PagerAdapter {
        //把ImagerVIew放到一个公共内存,以复用
        LinkedList<ImageView> convertView = new LinkedList<>();

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

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int index = position % datas.size();
            ImageView view;
            if (convertView.size() > 0) {
                view = convertView.remove(0);//把ImageView从公共内存中取出
            } else {
                view = new ImageView(UiUtils.getContext());
            }
            bitmapUtils.display(view, HttpHelp.SERVER_URL + "image?name=" + datas.get(index));
            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ImageView imageView = (ImageView) object;
            //viewPager移除View时,把ImagerVIew放到公共内存
            convertView.add(imageView);
            container.removeView(imageView);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值