首先总结一下大体思路就是通过一个ViewPager来进行无限的自动滑动来达到我们想要的实现的轮播图效果
首先先写UI
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager.widget.ViewPager android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/viewpager"/> </LinearLayout>
在上面的布局文件中我们只写了一个ViewPager控件,实现简单的轮播图效果(没有小圆点滑动)这一个控件就够了
然后我们在MainActivity中来对ViewPager进行实例化
public class MainActivity extends AppCompatActivity[ private ViewPager mViewPager; private ViewPagerAdapter adapter; private List dates; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ mViewPager=findViewById(R.id.view_pager); adapter=new MyViewAdapter(this,datas); mViewPager.setAdapter(adapter); } }
我们在上面设置了我们的ViewPager的适配器,所以我们下面也要来自己创建一个ViewPager的适配器
public class ViewPagerAdapter extends PagerAdapter { //我们存放图片的数据集合 private List<Integer> dates; private Context context; public ViewPagerAdapter( Context context,List datas) { this.dates=dates; this.context = context; } public void setDates(List dates) { this.dates = dates; } //这个方法返回的是我们的ViewPager可以滑动多少次 @Override public int getCount() { //返回个数为int的最大值 那么就可以滑动很多很多次 return dates==null ?0:Integer.MAX_VALUE; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view==object; } //每一次滑动都会调用下面这个方法 @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { //为了实现无限滑动而防止数组越界 我们可以通过下面这行代码来实现我们想要的功能 int newPosition=position%dates.size(); ImageView imageView=new ImageView(context); imageView.setBackgroundColor(dates.get(newPosition)); container.addView(imageView); return imageView; } //销毁试图 @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } public int getDatasSize(){ return dates.size(); } }
然后我们更改MainActivity中的代码 来创建一个handler来实现无限滑动
public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private List<Integer> dates=new ArrayList<>(5); private ViewPagerAdapter adapter; //创建一个handler private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //添加数据集合 Random random=new Random(); for(int i=0;i<=5;i++){ dates.add(Color.argb(random.nextInt(255),random.nextInt(255),random.nextInt(255),random.nextInt(255))); } adapter.setDates(dates); //我们先设置适配器后填充的数据 那么我们就要通知适配器我们的数据更改了 adapter.notifyDataSetChanged(); //设置不是从第一个开始并且关闭滑动动画那么刚开始就可以左右滑动 viewPager.setCurrentItem(adapter.getDatasSize()*100,false); //完成对handler的实例化 mHandler=new Handler(); } //当窗口处于后台的时候 @Override public void onDetachedFromWindow() { //停止handler任务 mHandler.removeCallbacks(lopperTask); } //当视图和窗口绑定的时候 @Override public void onAttachedToWindow() { //开始handler任务 mHandler.post(lopperTask); } //无限自动循环ViewPager的任务 private Runnable lopperTask=new Runnable() { @Override public void run() { //获取当前的视图位置 int currentItem = viewPager.getCurrentItem(); //设置下一个视图位置 viewPager.setCurrentItem(++currentItem,true); //一秒后重新执行这个任务 mHandler.postDelayed(this,1000); } }; private void initView() { viewPager = findViewById(R.id.view_pager); adapter=new ViewPagerAdapter(this); viewPager.setAdapter(adapter); } }