android Viewpage 无限循环播放

来源:互联网 发布:ubuntu 换源 电信 编辑:程序博客网 时间:2024/05/05 01:49

如题,研究了老半天,最后终于搞定了,先贴上自己的代码!

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() {@Overridepublic 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);}}// 广告viewpublic 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() {@Overridepublic 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);}}// 广告的pagerprivate class PdAdapter extends PagerAdapter {@Overridepublic 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());}@Overridepublic void destroyItem(ViewGroup container, int position, Object obj) {}@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object obj) {return view == obj;}}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic 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,

首先添加这一句:

@Overridepublic int getCount() {return Integer.MAX_VALUE;}
是的viewpage可以无限轮播;

其次修改初始化方法和destroyItem方法:

@Overridepublic 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());}@Overridepublic void destroyItem(ViewGroup container, int position, Object obj) {}
destroyItem方法不要放remove的操作,不然滑动的时候会有空白页出现,instantiateItem方法用取于的方法;

这样写完后,碰到了一个问题,播放的时候,界面会卡死,当时切换广告页的方法用的是,handler.sendEmptyMessageDelayed,

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

真是神奇的代码!


0 0