您的位置:首页 > 移动开发 > Android开发

android Viewpage 无限循环播放

2016-02-22 18:55 459 查看
如题,研究了老半天,最后终于搞定了,先贴上自己的代码!

package com.gaodun.faq.view;

import java.util.ArrayList;
import java.util.List;

import com.bumptech.glide.Glide;
import com.gaodun.common.pub.Global;
import com.gaodun.common.pub.MyLog;
import com.gaodun.faq.adapter.FaqControl;
import com.gaodun.faq.jazzyview.JazzyViewPager;
import com.gaodun.faq.jazzyview.JazzyViewPager.TransitionEffect;
import com.gaodun.faq.model.AdvertModel;
import com.gaodun.faq.model.Faq;
import com.gdwx.dayicpa.FaqActivity;
import com.gdwx.dayicpa.MainActivity;
import com.gdwx.dayicpa.R;
import com.gdwx.dayicpa.WebViewActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

public final class AdvertView extends LinearLayout implements OnPageChangeListener {

/** 直播默认图片 */
public final static String DEF_ADVER = "http://api.gaodun.com/Public/images/default_1.jpg";

private final static int PAGE_CHANGE_TIME = 4000;// 广告切换时间

public View view;

private Context context;

private View rlAdverView;

/* 广告 */
private static JazzyViewPager mJazzy;// 广告滑动
private Handler handler;// 设置自动滑动的handler

/** 广告的位置点 */
private List<ImageView> imgList;

private List<LinearLayout> listViews;

private PdAdapter adAdapter;

private LinearLayout mLayoutInflater;

private Runnable scrollRunnable = new Runnable() {

@Override
public void run() {
if (mJazzy != null) {
mJazzy.setCurrentItem(mJazzy.getCurrentItem() + 1);
handler.postDelayed(scrollRunnable, PAGE_CHANGE_TIME);
}
}
};

public AdvertView(Context context) {
super(context);
this.context = context;
init();
}

public AdvertView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init();
}

private final void init() {
view = LayoutInflater.from(getContext()).inflate(R.layout.item_header_firstfragment, null);

rlAdverView = view.findViewById(R.id.rl_advert_view);
rlAdverView.getLayoutParams().height = (int) (101 * Global.DeviceScale);
rlAdverView.requestLayout();

imgList = new ArrayList<ImageView>();

handler = new Handler();
}

private void sendScrollMessage() {
if (handler != null) {
handler.removeCallbacks(scrollRunnable);
handler.postDelayed(scrollRunnable, PAGE_CHANGE_TIME);
}

}

// 广告view
public void initAdView(List<AdvertModel> list) {
if (list.size() == 0) {// 添加默认广告
AdvertModel ad = new AdvertModel();
ad.setAdvertUrl("");
ad.setPicUrl(null);
ad.setType("-1");
list.add(ad);
}

addAdvertViews(list);
setAdvertChangePoint(list.size());
adAdapter = new PdAdapter();
mJazzy = (JazzyViewPager) view.findViewById(R.id.jazzy_pager);
mJazzy.setTransitionEffect(TransitionEffect.CubeOut);// 手风琴
mJazzy.setAdapter(adAdapter);
mJazzy.setPageMargin(30);
mJazzy.setOnPageChangeListener(this);
sendScrollMessage();
}

private void setAdvertChangePoint(int adCounts) {
// 广告页却换的点
imgList.clear();
LinearLayout pointView = (LinearLayout) view.findViewById(R.id.ll_point_view);

if (adCounts > 1) {
pointView.setVisibility(View.VISIBLE);
pointView.removeAllViews();
for (int i = 0; i < adCounts; i++) {
ImageView img = new ImageView(this.getContext());
img.setImageResource(R.drawable.bannerdll);
imgList.add(img);
pointView.addView(img);
}
} else {
pointView.setVisibility(View.GONE);
}
}

private void addAdvertViews(List<AdvertModel> list) {
listViews = new ArrayList<LinearLayout>();
for (int i = 0; i < list.size(); i++) {
final AdvertModel adver = list.get(i);
mLayoutInflater = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.ke_item_adv, null);
ImageView advertImg = (ImageView) mLayoutInflater.getChildAt(0);
advertImg.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

switch (v.getId()) {
case R.id.btn_adv:
int type = Integer.parseInt(adver.getType());
MyLog.e(type + "");
switch (type) {
case 1:
Intent i = new Intent();
i.putExtra(WebViewActivity.KEY_URL, adver.getAdvertUrl());
i.setClass(context, WebViewActivity.class);
((Activity) context).startActivity(i);
break;
case 2:
Faq faq = new Faq();
long id = Long.parseLong(adver.getAdvertUrl());
faq.setId(id);
FaqControl.getBrowseInstance().setBrowseFaq(faq);
MainActivity.startMeByType(getContext(), FaqActivity.FM_FAQ_DETAILS, FaqActivity.class);
break;
}
default:
break;
}
}
});
listViews.add(mLayoutInflater);
Glide.with(getContext()).load(adver.getPicUrl()).placeholder(R.drawable.def_banner).into(advertImg);
}
}

// 广告的pager
private class PdAdapter extends PagerAdapter {
@Override
public Object instantiateItem(ViewGroup container, final int position) {
if (listViews.get(position % listViews.size()).getParent() != null) {
((ViewPager) container).removeView(listViews.get(position % listViews.size()));
}
((ViewPager) container).addView(listViews.get(position % listViews.size()), 0);
return listViews.get(position % listViews.size());
}

@Override
public void destroyItem(ViewGroup container, int position, Object obj) {
}

@Override
public int getCount() {
return Integer.MAX_VALUE;
}

@Override
public boolean isViewFromObject(View view, Object obj) {
return view == obj;
}
}

@Override
public void onPageScrollStateChanged(int arg0) {

}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageSelected(int arg0) {
int itemIndex = arg0 % listViews.size();
int imgPointSize = imgList.size();
if (imgPointSize > 1) {
for (int i = 0; i < imgList.size(); i++) {
imgList.get(i).setImageResource(R.drawable.bannerdll);
}
imgList.get(itemIndex).setImageResource(R.drawable.bannerdllcur);
}
}

}


xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<RelativeLayout
android:id="@+id/rl_advert_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<com.gaodun.faq.jazzyview.JazzyViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/jazzy_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<LinearLayout
android:id="@+id/ll_point_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>

</LinearLayout>
如上代码是自定义的广告banner,大部分代码都是初始化数据的代码,

请看主要代码 PdAdapter,

首先添加这一句:

@Override
public int getCount() {
return Integer.MAX_VALUE;
}
是的viewpage可以无限轮播;
其次修改初始化方法和destroyItem方法:

@Override
public Object instantiateItem(ViewGroup container, final int position) {
if (listViews.get(position % listViews.size()).getParent() != null) {
((ViewPager) container).removeView(listViews.get(position % listViews.size()));
}
((ViewPager) container).addView(listViews.get(position % listViews.size()), 0);
return listViews.get(position % listViews.size());
}

@Override
public void destroyItem(ViewGroup container, int position, Object obj) {
}destroyItem方法不要放remove的操作,不然滑动的时候会有空白页出现,instantiateItem方法用取于的方法;
这样写完后,碰到了一个问题,播放的时候,界面会卡死,当时切换广告页的方法用的是,handler.sendEmptyMessageDelayed,

后来换成了handler.postDelayed,使用了 runnable 来更新UI 就没有这个问题了;

真是神奇的代码!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息