您的位置:首页 > 其它

基于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;
}

}




结果展示





扩展性

扩展性,扩个瓜皮



谢谢

老夫煮饭去了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: