前言
前些天需要使用到安卓的banner,也就是现在主流app主页的无限轮播的横幅,现在已经有很多好的开源项目可以直接使用,不过我还是想自己去实现一遍。因为是访问的网络数据,实际过程中还是有些坑的,所以还是记录一下。
具体实现
首先还是来看看最终的效果,gif是有些卡顿,跑起来还是很流畅的
了解到,现在实现这种横幅,基本上是2种方式,一种是使用RecyclerView的横向滚动去实现,因为横幅是从一个页面直接跳转到下一页,用RecyclerView需要监听滑动的过程,计算滑动的距离,然后进行跳转,后面官方考虑到这一点提供了PagerSnapHelper这个工具类来解决这个问题,这里就不多说了。
这篇博客主要就是写的就是第二种方式,使用ViewPager去实现。
首先,要用ViewPager实现无限轮播,可以使PagerAdapter的getCount方法返回Integer.MAX_VALUE。也就是让页面数量返回一个Integer的最大值,这样在滑动过程中产生一种无限循环的假象,首先写一个抽象基类,继承自PagerAdapter
定义适配器
public abstract class BannerViewBaseAdapter extends PagerAdapter {
private List<View> mList;
private View mView;
public BannerViewBaseAdapter() {
mList = new ArrayList<>();
}
/**
* 返回Integer的最大值
*/
@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) {
Log.d("I am postion cx cx xcx", String.valueOf(position));
if (getSize() != 0) {
if (mList.size() <= (position % getSize())) {
for (int i = mList.size();i <= position % getSize();++i) {
mList.add(getView(container,i));
}
}
mView = mList.get(position % getSize());
if (mView.getParent() != null) {
container.removeView(mView);
}
container.addView(mView);
}
return mView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 滑动下一张图时当前的图
if (getSize() != 0 && position != 0) {
container.removeView(mList.get(position % getSize()));
}
}
/**
* 获取要显示的View
* @param container
* @param position
* @return
*/
public abstract View getView(ViewGroup container,int position);
/**
* 获取实际ItemView的数量
* @return
*/
public abstract int