上一节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);
//设置位置
}