基于MVP模式下的无限轮播ViewPager
2017-05-22 18:09
471 查看
基于MVP模式下的无限轮播ViewPager
老年人操作来的,不喜勿喷哦使用场景
设计思路
代码实现
结果展示
扩展性
使用场景
广告轮播-APP首次启动时的引导界面(为什么不用长展示的html页面?)一些产品介绍的轮播
新闻的轮播
总而言之–就是轮播(建设银行的app不知道各位兄台使用过没,它有个车轮轮播,比这个吊一点但是使用起来很怪)
设计思路
如下为思维导图(瞎bb的)如上是我想要加载的三张网络图片,如何让这三个帅b无限次的滚动呢?
首先这三个图片的控件是viewpager,它要设置一个数据源,要达到无限的滚动,其实就是数据页的变换,viewpager的数据页变换的方法是setCurrentItem();大多时候我们使用的都是单参的方法,就是直接默认的跳到position页,而它还含有双参的调用
/** * Set the currently selected page. * @param item Item index to select * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately */ public void setCurrentItem(int item, boolean smoothScroll) { mPopulatePending = false; setCurrentItemInternal(item, smoothScroll, false); }
大致能看懂一点:transition immediately 立即转变,也就是没有动画效果(那大致的思路就出来了)
我们只需要将实际下载的图片3后面加一个伪页面图片1,并且在图片1的前面加一个伪页面图片3,这样保证了3的下一个一定是1或者说是1的前一个一定是3,然后当viewpager的当前显示为第一个3时,我们无动画效果跳转到第二个3,当当前的viewpager的显示为第二个1时,我们无动画效果跳转到第一个1,然后他后面的滚动我们就不需要理会了。
代码实现
这里我们使用mvp的设计模式实现该场景的viewpager(纯属只想让代码更简洁,可维护性更强)以下为目录结构
MVP设计模式这里说明的很好,看了文档后,马里皮,连mvvm也会了:传送
这里是我写的一个manager,在这里没有什么用,不过你也可以在这里扩展些其他的东西,如布局的主题颜色,字体等(当然你也可以直接写死在布局里)
public class ViewPagerManager { //增加可扩展性 private static ViewPagerManager viewPagerManager; public static ViewPagerManager initManager(ViewPager_Bean viewPager_bean){ //如果一个项目多次使用这个viewpager 需要修改这里的单例模式 if(viewPagerManager==null){ viewPagerManager=new ViewPagerManager(); } return viewPagerManager; } }
下面按照步骤来展示代码
视图view
public class InfiniteViewPager extends LinearLayout implements InfinitePresenterView{ .... //初始化数据 public void init(Context context){ linearLayout= (LinearLayout) LayoutInflater.from(context).inflate(R.layout.infiniteviewpager_layout,this); group= (LinearLayout) linearLayout.findViewById(R.id.viewpager_linearlayout_point); textView= (TextView) linearLayout.findViewById(R.id.viewpager_text); viewPager= (ViewPager) linearLayout.findViewById(R.id.viewpager_all); } //设置数据的 public void setPresenter(ViewPager_Bean viewPager_bean){ this.viewPager_bean=viewPager_bean; son=new InfinitePresonter_Son(viewPager_bean,context,viewPager,group,textView); startViewPager(); } @Override public void startTimer() { if(son!=null){ son.startTimer(); } } @Override public void startViewPager() { if(son!=null) { son.startViewPager(); } } @Override public void destroyTimer() { if(son!=null){ son.destroyTimer(); } }
视图view的接口
public interface InfinitePresenterView { void startTimer(); void startViewPager(); void destroyTimer(); }
Presenter层
public interface InfinitePresonter_All { void startTimer(); void startViewPager(); void destroyTimer(); }
Presenter 实现(太多了 ,可以看module源码)
@Override public void startTimer() { timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { Message message=Message.obtain(); message.what=0; handler.sendEmptyMessage(message.what); } },0,3000); } @Override public void startViewPager() { if(viewPager_bean.getImage_id()!=null){//如果是本地的图片 //图片这一块 我没有考虑图片失帧,如果你考虑可以在这加 for(int i=0;i<image_size;i++){ ImageView imageView=new ImageView(context); imageView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); if(i==0){//第0张应该为下载的最后一张 imageView.setImageResource(viewPager_bean.getImage_id()[viewPager_bean.getImage_url().length-1]); }else if(i>=1&&i<=viewPager_bean.getImage_id().length){ imageView.setImageResource(viewPager_bean.getImage_id()[i-1]); imageView.setTag(i-1);//这里的tag是为了区分点击的是哪一个图片 imageView.setOnClickListener(this);//点击的监听 可以增加实现 ,在下面 }else if(i==image_size-1){//最后一张应该为下载的第一张 imageView.setImageResource(viewPager_bean.getImage_id()[0]); } listimage.add(imageView); } ..... } } @Override public void destroyTimer() { if(timer!=null) { timer.cancel(); timer = null; } } @Override public void onClick(View v) { //每一个图片的点击监听 }
Model层
public class ViewPager_Bean { private String[] image_url;//所有图片的url private String[] title_text;//如果需要显示每一页的title private int [] image_id;//本地的就是资源id public String[] getImage_url() { return image_url; } public void setImage_url(String[] image_url) { this.image_url = image_url; } public String[] getTitle_text() { return title_text; } public void setTitle_text(String[] title_text) { this.title_text = title_text; } public int[] getImage_id() { return image_id; } public void setImage_id(int[] image_id) { this.image_id = image_id; } }
结果展示
扩展性
扩展性,扩个瓜皮谢谢
老夫煮饭去了相关文章推荐
- Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件
- 基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView
- 基于ViewPager的无限循环广告轮播图 FlyBanner
- ViewPager实现无限轮播图
- android viewpager轮播图无限循环
- 三层继承ViewPager实现无限轮播图Banner
- 开源一个基于ViewPager的无限轮循动画指示器
- ViewPager自动无限轮播加小圆点
- Android ViewPager实现广告无限轮播
- ViewPager+小圆点进行无限轮播
- Android使用ViewPager实现无限循环滑动及轮播(附源码)
- Viewpager无限轮播
- Viewpager自动无限轮播+小圆点
- android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。
- Android使用ViewPager实现无限循环滑动及轮播(附源码)
- 开源一个基于ViewPager的无限轮循动画指示器
- 使用ViewPager实现自动无限循环的轮播
- android无限轮播banner图片--viewpager
- ViewPager 实现前后自由的“无限”轮播
- 基于UICollectionView的无限轮播器(封装)