今天有个需求在自己的viewpager上实现无限循环,故此做笔记!
原理分析
基本原理很好理解,我们需要展示出来的三张照片的话,那么我们在建 ViewPager页面的时候,多建两张,分别放在头和尾,头和倒数第二张图片一样,尾和正数第二张照片一样。如下图
image
页面滑动是从第二张图片开始,当页面滑动到最后一张图片的时候,自动跳转到第二张图片并且取消切换动画。这样就可以基本上实现无限滑动
适配器中的代码如下
其实在适配器中的构造代码中我是这样写的:
private List<View> views;
public MyAdapter(Activity ctx, List<AuthorBreifModel> data) {
this.mContext = ctx;
this.mData = data;
views=new ArrayList<>();
views.add(initView(ctx,mData.size()-1));
for (int a=0;a<data.size();a++){
views.add(initView(ctx,a));
}
views.add(initView(ctx,0));
}
这里主要实现的是在显示的前面跟后面分别按照我们原理中的讲解来增加两个组件
其中方法initView(ctx,a)其实就是对view里面的控件进行界面显示,例如设置view中其中一个textview的文本等等,例如下面代码:
private View initView(Activity activity,int position){
View itemView = activity.getLayoutInflater().inflate( R.layout.item_novel_author, null);
mAuhtorAvatarImg = itemView.findViewById(R.id.img_auhtor_avatar);
mAuthorNameTv.setText(name);
return itemView;
}
其余的方法如下,都是常规的方法:
@Override
public int getCount() {
return views.size();
}
@Override
public Object instantiateItem(final ViewGroup container, final int position) {//子View显示
View itemView = views.get(position);
container.addView(itemView);
return itemView;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
监听显示的位置
这里主要就是监听viewpager的滑动了
private int curponsition=1;
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
curponsition = i;
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
if (curponsition == 0){
mViewPager.setCurrentItem(authorBreifModels.size(), false);
} else if (curponsition == authorBreifModels.size()+1) {
mViewPager.setCurrentItem(1, false);
}
}
}
});
这里主要就是监听是滑动到第一个还是最后一个,如果是第一个就设置当前位置为倒数的第二个,如果是最后一个就设置当前位置为顺数第二个,所以这样就能达到两边永远有下一个跟上一个,因为设置当前页面的时候取消了动画的,所以不会出现闪的现象视觉上就感觉没变化,这样就简单的实现了无限循环!
感谢作者提供思路
网友评论