1. 程式人生 > >Android動態載入輪播圖BannerView

Android動態載入輪播圖BannerView

輪播圖在每個app中扮演著一個點綴的角色,在獨立做了三款app後都有這個需求,所以我決定把它單獨抽出來。以後只需copy,然後再根據需求改一下即可。
這裡寫圖片描述

/**
 * 載入網路輪播圖
 *@author jiangrongtao
 *
 *csdn:http://blog.csdn.net/jiang_rong_tao
 *
 *github:https://github.com/jiangrongtao/jiangrongtao.github.io
 *
 * created at 2016/6/3 9:14
*/


public class BannerView {
    private View bannerView;
    private
Context mContext; private Map<String,String> maps; private FragmentManager manager; private List<Fragment> mList; private MyChildViewPager bannerPager; private ImageView defImage;//設定預設圖片 public static boolean LOAD_FINISH=false;//是成功載入banner private LinearLayout llDots;//下部的小白點的佈局
public boolean isRoll = false;//是否輪播 private List<View> dotList = new ArrayList<View>();//存放小白點 private static final String TAG = "BannerView"; public BannerView(Context context,Map<String,String> maps,FragmentManager manager){ this.mContext=context; this
.maps=maps; this.manager=manager; mList=new ArrayList<Fragment>(); } protected Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what){ case 1: final List<BannerInfo> data = (List<BannerInfo>) msg.obj; setBannerInfo(data); break; case 2: LOAD_FINISH=false; defImage.setVisibility(View.VISIBLE); break; case 3: if (mList.size() > 0) { bannerPager.setCurrentItem((bannerPager.getCurrentItem() + 1) % mList.size()); } else { isRoll = false; } break; } } }; /** * 設定banner資訊 * @param data */ private void setBannerInfo(final List<BannerInfo> data) { mList.clear(); for (int i = 0; i < data.size(); i++) { final int j = i; final ImageView imageView = new ImageView(mContext); BannerInfo bannerInfo = data.get(i); APIImageLoader.displayImage(mContext,bannerInfo.getUrl(), R.drawable.banner_fial,R.drawable.banner_fial,imageView); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String hrefUrl = data.get(j).getHrefUrl(); if (!TextUtils.isEmpty(hrefUrl)) { Intent intent = new Intent(mContext, AppDetailActivity.class); intent.putExtra("hrefUrl", hrefUrl); mContext.startActivity(intent); } } }); Fragment fragment = new Fragment() { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return imageView; } }; mList.add(fragment); } if(mList.size()>0){ defImage.setVisibility(View.GONE); bannerPager.setAdapter(new BannerAdapter(manager, mList)); initDot(); bannerPager.setCurrentItem(0); LOAD_FINISH=true; }else{ LOAD_FINISH=false; defImage.setVisibility(View.VISIBLE); } } public View getBannerView() { bannerView=View.inflate(mContext, R.layout.banner_layout,null); bannerPager= (MyChildViewPager) bannerView.findViewById(R.id.banner_pager); defImage = (ImageView)bannerView.findViewById(R.id.iv_default_page); llDots=(LinearLayout)bannerView.findViewById(R.id.ll_dots); initBannersData(); return bannerView; } /* * 設定迴圈輪播 * */ public void setBannerCycle(long loopTime){ if(LOAD_FINISH){ if(null!=bannerPager){ isRoll=true; startLooper(loopTime); bannerPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switchDot(position); } @Override public void onPageScrollStateChanged(int state) { } }); } } } /** * 開啟輪播 * @param loopTime 輪播間隔時間 */ private void startLooper(final long loopTime) { new Thread() { public void run() { while (isRoll) { handler.sendEmptyMessageDelayed(3,loopTime); } }; }.start(); } //獲取網路banner圖片 private void initBannersData() { maps.clear(); RequestManager.getInstance(mContext).sendPost(APIConfig.GET_BANNERS, maps, BannerRes.class, new Callback<BannerRes>() { @Override public BannerRes parseNetworkResponse(Response response) throws Exception { return GsonUtils.object(response.body().string(),BannerRes.class); } @Override public void onError(Call call, Exception e) { } @Override public void onResponse(BannerRes response) { if(APIResCode.SUCCESS.equals(response.getResCode())){ List<BannerInfo> data = response.getData(); if (data!=null&&data.size()>0){ handler.sendMessage(handler.obtainMessage(1, data)); }else{ handler.sendEmptyMessage(2); } } } }); } /** * 初始化小圓點 */ private void initDot() { llDots.removeAllViews(); dotList.clear(); for (int i = 0; i < mList.size(); i++) { View view = new View(mContext); //預設選中第一個小白點 view.setBackgroundResource(i == 0?R.drawable.dot_sel:R.drawable.dot_nor); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(8, 8); params.setMargins(0, 0, 12, 0); llDots.addView(view, params); dotList.add(view); } } /** * 切換圓點 */ private void switchDot(int position) { for (int i = 0; i < dotList.size(); i++) { dotList.get(i).setBackgroundResource(i == position?R.drawable.dot_sel:R.drawable.dot_nor); } } }

輪播圖介面卡:

public class BannerAdapter extends FragmentPagerAdapter{
    List<Fragment> list ;
    public BannerAdapter(FragmentManager fm, List<Fragment> list) {
        super(fm);
        this.list = list ;
    }
    @Override
    public  Fragment getItem(int index) {
        return list.get(index%list.size());
    }
    @Override
    public int getCount() {
        return list.size();
    }
}

佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" >
    <com.jianzhilaila.money.ui.view.myviewpager.MyChildViewPager
        android:id="@+id/banner_pager"
        android:layout_width="match_parent"
        android:layout_height="200dp">
    </com.jianzhilaila.money.ui.view.myviewpager.MyChildViewPager>
    <ImageView
        android:id="@+id/iv_default_page"
        android:layout_width="match_parent"
        android:layout_height="208dp"
        android:background="@drawable/banner_fial" />
    <LinearLayout
    android:id="@+id/ll_dots"
    android:layout_width="match_parent"
    android:layout_height="8dp"
    android:layout_alignParentBottom="true"
    android:gravity="center"
    android:layout_gravity="bottom"
    android:layout_marginBottom="10dp"
    android:orientation="horizontal" />
</FrameLayout>

具體用法

//獲取banner
 BannerView bannerView = new BannerView(context, maps,   getChildFragmentManager());
        View banner = bannerView.getBannerView();
        mLinearLayout.addView(banner,0);
        bannerView.setBannerCycle(1500);
在onDestroyView()或onDestroy()中記得設定:**isRoll=false;** ,避免記憶體溢位。
mLinearLayout是輪播圖頁面的根佈局。getChildFragmentManager是由於我的Viewpager是巢狀使用的。MyChildViewPager 是一個自定義的防止巢狀使用滑動事件衝突的類。RequestManager和APIImageLoader是我自己二次封裝的網路請求和圖片載入類,在我以前的部落格http://blog.csdn.net/jiang_rong_tao/article/details/51516977中。

注意:上面程式碼有很多要改進的地方,如果有bug自己修復,可以把改進的程式碼分享一下。