ViewPager实现一个自动轮播的轮播图第二节实现图片无限滑动

上一节viewpager大体框架已经搭出来了,我们发现轮播图是有了,就是不能自动轮播,而且只能手动左右滑动,而且也不能无限滑动,按顺序滑动到首尾就划不动了,下一步我们先实现如何让图片无论前后都可以无限滑动,首先我们要改的地方就是适配器里面的getCount()设定内容长度的方法,改成一个足够大的数

 //设定内容长度
        @Override
        public int getCount() {

            return Integer.MAX_VALUE;//MAX_VALUE = 2147483647
        }

然后还需要改一下初始化方法内填入数据的地方,因为我们长度是改成最大值了,但是填充内容的集合还是原来的长度,如果滑到超出集合长度了,程序就会因为角标越界崩溃,所以还要把集合内容填充进pager的地方改成可以无限循环集合长度。这里我们因为是4张图片,所以我们设一个数,这个数就是用刚才设定的长度取模数组的长度,打个比方

我们滑动到4的时候取模集合size长度4,那就是0,此时显示集合位置为0的图片

到5的时候取模4就是1,显示位置为1的图片

滑到6取模4位2,显示位置2

以此类推7%4=3

8%4=0,又回来了,一个伪无限循环就成了,直到用户滑到2147483647次之前都不会因为这个崩溃的

 public Object instantiateItem(@NonNull ViewGroup container, int position) {
            //绑定布局
            View item = LayoutInflater.from(container.getContext()).inflate(R.layout.item,container,false);
            //设置数据
            ImageView imageView = item.findViewById(R.id.imageView);
            //先把imageview绑定
            int realPosition = position % Data.size();
            imageView.setImageResource(Data.get(realPosition));
            //然后在imageview中填入集合中的图片数据
            if (imageView.getParent() instanceof  ViewGroup){
                    ((ViewGroup) imageView.getParent()).removeView(imageView);
            }
            //不添加这行代码会报错,改子类已经拥有一个父类,这里我们判断如果父类是group就在父类中删除,
            // 如果不是就直接添加进pager里面
            container.addView(imageView);

            return imageView;
        }

到这里仅仅是实现了,往后滑的无限,而往前滑的方法也很简单,只需要在往集合里填内容的地方写一个设置位置的方法,里面的值就填刚才设定的长度的中间就行

 /**
     * 添加图片到集合的方法
     */
    private void initData(){
        Data.add(R.mipmap.img1);
        Data.add(R.mipmap.mig2);
        Data.add(R.mipmap.mig3);
        Data.add(R.mipmap.mig4);
        looperpagerAdapter.notifyDataSetChanged();
        //更新数据
        viewPager.setCurrentItem(Integer.MAX_VALUE/2);
        //设置位置
    }

下面是完整代码

package com.example.viewpager;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    //声明Pager
    private LooperpagerAdapter looperpagerAdapter = new LooperpagerAdapter();
    //声明Pager适配器
    private List<Integer> Data = new ArrayList<>();
    //用于放图片的集合
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = findViewById(R.id.viewPager);
        //绑定Pager
        viewPager.setAdapter(looperpagerAdapter);
        //添加适配器
        initData();


    }


    /**
     * 添加图片到集合的方法
     */
    private void initData(){
        Data.add(R.mipmap.img1);
        Data.add(R.mipmap.mig2);
        Data.add(R.mipmap.mig3);
        Data.add(R.mipmap.mig4);
        looperpagerAdapter.notifyDataSetChanged();
        //更新数据
        viewPager.setCurrentItem(Integer.MAX_VALUE/2);
        //设置位置
    }
    private class LooperpagerAdapter extends PagerAdapter {
        //设定内容长度
        @Override
        public int getCount() {

            return Integer.MAX_VALUE;//MAX_VALUE = 2147483647
        }

        /**
         * 初始化
         * @param container
         * @param position
         * @return
         */
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            //绑定布局
            View item = LayoutInflater.from(container.getContext()).inflate(R.layout.item,container,false);
            //设置数据
            ImageView imageView = item.findViewById(R.id.imageView);
            //先把imageview绑定
            int realPosition = position % Data.size();
            imageView.setImageResource(Data.get(realPosition));
            //然后在imageview中填入集合中的图片数据
            if (imageView.getParent() instanceof  ViewGroup){
                    ((ViewGroup) imageView.getParent()).removeView(imageView);
            }
            //不添加这行代码会报错,改子类已经拥有一个父类,这里我们判断如果父类是group就在父类中删除,
            // 如果不是就直接添加进pager里面
            container.addView(imageView);

            return imageView;
        }

        /**
         * 销毁
         * 作用是达到循环使用,不会导致溢出
         * @param container
         * @param position
         * @param object
         */
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            //删除数据
            container.removeView((View) object);

        }

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


}

这样无论是向前还是向后滑动都可以无限滑动了

最后,如果你想要设定哪一张图片为程序运行第一个显示,只需要在设定位置的数据那里相应的+上几就行,比如

 /**
     * 添加图片到集合的方法
     */
    private void initData(){
        Data.add(R.mipmap.img1);
        Data.add(R.mipmap.mig2);
        Data.add(R.mipmap.mig3);
        Data.add(R.mipmap.mig4);
        looperpagerAdapter.notifyDataSetChanged();
        //更新数据
        viewPager.setCurrentItem(Integer.MAX_VALUE/2 + 1);
        //设置位置
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值