基于MVP模式下的无限轮播ViewPager

基于MVP模式下的无限轮播ViewPager

老年人操作来的,不喜勿喷哦
这里写图片描述

  • 使用场景
  • 设计思路
  • 代码实现
  • 结果展示
  • 扩展性

这里写图片描述

使用场景

  • 广告轮播-APP首次启动时的引导界面(为什么不用长展示的html页面?)
  • 一些产品介绍的轮播
  • 新闻的轮播
  • 总而言之–就是轮播(建设银行的app不知道各位兄台使用过没,它有个车轮轮播,比这个吊一点但是使用起来很怪)

这里写图片描述

设计思路

如下为思维导图(瞎bb的)

思维导图1
如上是我想要加载的三张网络图片,如何让这三个帅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 立即转变,也就是没有动画效果(那大致的思路就出来了)

思维导图2

我们只需要将实际下载的图片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;
    }

}

这里写图片描述

结果展示

这里写图片描述

这里写图片描述

扩展性

扩展性,扩个瓜皮

这里写图片描述

谢谢

老夫煮饭去了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值