一种ViewPager无限循环的实现

原理就是当总个数大于1时,getCount返回一个最大值Integer.MAX_VALUE,然后循环展示对应的图片

基于ViewPager原理,缓存3个视图用于展示 ,并设置起始的位置。

public static class LoopPagerAdapter extends PagerAdapter {
        public static class ViewHolder {
            View v;
            ImageView iv;
            TextView tv;

            public void recycle() {
                v = null;
                iv = null;
                tv = null;
            }
        }

        Context context;
        List<String> urls;
        //最多保存3个ViewHolder用于显示
        SparseArray<ViewHolder> viewHolders = new SparseArray<ViewHolder>();

        public LoopPagerAdapter(Context context, List<String> urls) {
            this.context = context;
            this.urls = urls;
        }

        @Override
        public int getCount() {
            int realCount = getRealCount();
            return realCount <= 1 ? realCount : Integer.MAX_VALUE;
        }

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


        //实际的个数
        private int getRealCount() {
            return null == urls ? 0 : urls.size();
        }

        //相对于原始的索引
        private int getRealPosition(int position) {
            return position % urls.size();
        }

        //ViweHolder的索引,最多缓存3个
        private int getViewIndex(int position) {
            return position % 3;
        }

        //第一个item
        private int getFirstItem() {
            int realCount = getRealCount();
            return realCount <= 1 ? 0 : (Integer.MAX_VALUE / 2  / realCount * realCount);
        }

        //相对于原始的数组的第n个item
        private int getItemOffset(int index) {
            return getFirstItem() + index;
        }

        private ViewHolder createViewHolder() {
            LinearLayout ll = new LinearLayout(context);

            ll.setOrientation(LinearLayout.VERTICAL);
            ImageView iv = new ImageView(ll.getContext());
            TextView tv = new TextView(ll.getContext());
            tv.setTextSize(25);
            tv.setMinHeight(100);
            tv.setGravity(Gravity.CENTER);

            ll.addView(iv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1));
            ll.addView(tv);

            ViewHolder vh = new ViewHolder();
            vh.v = ll;
            vh.iv = iv;
            vh.tv = tv;

            return vh;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int realPosition = getRealPosition(position);
            int viewIndex = getViewIndex(position);
            ViewHolder vh = viewHolders.get(viewIndex);

            if (null == vh) {
                vh = createViewHolder();
                viewHolders.put(viewIndex, vh);
            } else if (vh.v.getParent() != null) {
                ((ViewGroup)vh.v.getParent()).removeView(vh.v);
            }

            vh.tv.setText("Item : " +realPosition + " / " + getRealCount() );
            Picasso.with(context).load(urls.get(realPosition)).into(vh.iv);

            container.addView(vh.v);
            return vh.v;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
        }

        public void recycle() {
            context = null;
            urls = null;

            for (int i = 0; i < viewHolders.size(); i++) {
                viewHolders.get(i).recycle();
            }
            viewHolders.clear();
            viewHolders = null;
        }
    }

使用时需要设置一个初始位置:

viewPager.setCurrentItem(adapter.getFirstItem());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值