動態加載:ViewPager數量

**請大家關注下我的微信公衆號:哦哦猿
QQ羣:552123831**
在開發中,我們會遇見很多問題,比如我現在說的這個問題,就是經常遇見的。
那就是動態加載ViewPager,根據服務器的值去定有多少個ViewPager,
這裏寫圖片描述
ViewPager是支持左右滑動的效果很好。

廢話不說,直接代碼。
新建類:
BitmapData.java

package com.anzh.viewpager;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
import android.widget.ImageView;

public class BitmapData implements Parcelable{
    public Bitmap bitmap;
    public ImageView imageView;
    public BitmapData(Bitmap bitmap,ImageView imageView){
        this.bitmap = bitmap;
        this.imageView = imageView;
    }
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

}

新建類:
GetBitMap.java

package com.anzh.viewpager;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 *
 */
@SuppressWarnings("unused")
public class GetBitMap implements Runnable {    

    private List<BitMapMsg> mQueue = new ArrayList<BitMapMsg>();
    private static boolean running = false;
    private static GetBitMap mGetBitmap = null;
    private Bitmap bitmap;
    private GetBitMap(){    
    }

    public static GetBitMap instance(){
        if(mGetBitmap == null){
            mGetBitmap = new GetBitMap();
        }
        return mGetBitmap;
    }


    public void add(Context context,Handler handler,String path, int mCode){
        add(context, handler, path, mCode,null);
    }

    public void add(Context context,Handler handler,String path, int mCode,ImageView imageView){
        BitMapMsg msg = new BitMapMsg();
        msg.mConext = context;
        msg.mHandler = handler;
        msg.path = path;
        msg.mCode = mCode;
        msg.mImgView = imageView;
        mQueue.add(msg);
        if(!running){
            new Thread(this).start();
        }
    }

    public void run() {
        running = true;
        while(mQueue.size() > 0 ){
            BitMapMsg msg = null;
            synchronized (mQueue) {
                msg = mQueue.remove(0);
            }
            if(msg != null && !msg.path.equals("")){
                Message message = new Message();
                message.what = msg.mCode;
                if(msg.mImgView != null){
                    BitmapData bitmapData = new BitmapData(getBitmap(msg,msg.path),msg.mImgView);
                    message.getData().putParcelable("bitmap", bitmapData);
                    msg.mHandler.sendMessage(message);
                }
            }
        }
        running = false;
    }

    /**
     * 以最小內存獲取資源圖片
     * @param resId
     * @return
     */
    private Bitmap getBitmap(BitMapMsg msg,String path){
        try {
            InputStream is = msg.mConext.getResources().getAssets().open(path);
            BitmapFactory.Options opt = new BitmapFactory.Options();
            opt.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(is, null, opt);
            opt.inSampleSize = computeSampleSize(opt, -1, 480*800);  

            opt.inJustDecodeBounds = false;
            opt.inPreferredConfig = Bitmap.Config.RGB_565;
            opt.inPurgeable = true;
            opt.inInputShareable = true;
            bitmap = BitmapFactory.decodeStream(is, null, opt);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
    /**
     * 動態計算inSampleSize
     * @param options
     * @param minSideLength
     * @param maxNumOfPixels
     * @return
     */
    public static int computeSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
        int initialSize = computeInitialSampleSize(options, minSideLength,
                maxNumOfPixels);

        int roundedSize;
        if (initialSize <= 8) {
            roundedSize = 1;
            while (roundedSize < initialSize) {
                roundedSize <<= 1;
            }
        } else {
            roundedSize = (initialSize + 7) / 8 * 8;
        }

        return roundedSize;
    }

    private static int computeInitialSampleSize(BitmapFactory.Options options,
            int minSideLength, int maxNumOfPixels) {
        double w = options.outWidth;
        double h = options.outHeight;

        int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
                .sqrt(w * h / maxNumOfPixels));
        int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math
                .floor(w / minSideLength), Math.floor(h / minSideLength));

        if (upperBound < lowerBound) {
            // return the larger one when there is no overlapping zone.
            return lowerBound;
        }

        if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
            return 1;
        } else if (minSideLength == -1) {
            return lowerBound;
        } else {
            return upperBound;
        }
    }
    public static class BitMapMsg{
        public Context mConext;     
        public Handler mHandler;
        public String path = "";
        public int mCode;           
        public ImageView mImgView;  

        public BitMapMsg(){

        }
    }

}

新建類:
ViewPagerAdapter.java

package com.anzh.viewpager;

import java.util.List;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

public class ViewPagerAdapter extends PagerAdapter {
     //界面列表
    private List<View> views;
    public ViewPagerAdapter (List<View> views){
        this.views = views;
    }
    //銷燬arg1位置的界面
    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView(views.get(arg1));        
    }
    @Override
    public void finishUpdate(View arg0) {
        arg0.postInvalidate();
    }

    //獲得當前界面數
    @Override
    public int getCount() {
        if (views != null)
        {
            return views.size();
        }

        return 0;
    }
    //初始化arg1位置的界面
    @Override
    public Object instantiateItem(View arg0, int arg1) {
        ((ViewPager) arg0).addView(views.get(arg1), 0);
        return views.get(arg1);
    }
    //判斷是否由對象生成界面
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return (arg0 == arg1);
    }
    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {
    }
    @Override
    public Parcelable saveState() {
        return null;
    }
    @Override
    public void startUpdate(View arg0) {
    }
}

這個是MainActivity 裏面的代碼: (圖片資源在assets文件夾下面,當然你可以把它換成你從服務器或者的圖片)

package com.anzh.viewpager;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements OnClickListener, OnPageChangeListener{
     private ViewPager vp;
        private ViewPagerAdapter vpAdapter;
        private List<View> views;
        private int lastValue = -1;
        //引導圖片資源
        private String[] pics;
        //底部小點圖片
        private ImageView[] dots ;
        //記錄當前選中位置
        private int currentIndex;
        private final int UPDATEDATA = 1;
        Handler mHandler = new Handler(){
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case UPDATEDATA:
                        BitmapData bitmapData = msg.getData().getParcelable("bitmap");
                        bitmapData.imageView.setImageBitmap(bitmapData.bitmap);
                        break;
                }
            };
        };

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            views = new ArrayList<View>();
            initImage();
            vp = (ViewPager) findViewById(R.id.viewpager);
            //初始化Adapter
            vpAdapter = new ViewPagerAdapter(views);
            vp.setAdapter(vpAdapter);
            //綁定回調
            vp.setOnPageChangeListener(this);
            //初始化底部小點
            initDots();

        }
        private void initImage(){
            try {
                pics = this.getResources().getAssets().list("guide");
                LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT);

                //初始化引導圖片列表
                for(int i=0; i<pics.length; i++) {
                    ImageView iv = new ImageView(this);
                    iv.setLayoutParams(mParams);
                    GetBitMap.instance().add(this, mHandler,"guide/"+pics[i], UPDATEDATA,iv);
                    views.add(iv);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        private void initDots() {
            LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            mLayoutParams.setMargins(3, 0, 3, 0);
            LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
            dots = new ImageView[pics.length];
            //循環取得小點圖片
            for (int i = 0; i < pics.length; i++) {
                dots[i] = new ImageView(this);
                dots[i].setLayoutParams(mLayoutParams);
                dots[i].setBackgroundResource(R.drawable.dot);
                dots[i].setEnabled(true);//都設爲灰色
                dots[i].setOnClickListener(this);
                dots[i].setTag(i);//設置位置tag,方便取出與當前位置對應
                ll.addView(dots[i]);
            }

            currentIndex = 0;
            dots[currentIndex].setEnabled(false);//設置爲白色,即選中狀態״̬
        }

        /**
         *設置當前的引導頁
         */
        private void setCurView(int position)
        {
            if (position < 0 || position >= pics.length) {
                return;
            }

            vp.setCurrentItem(position);
        }

        /**
         *這隻當前引導小點的選中
         */
        private void setCurDot(int positon)
        {
            if (positon < 0 || positon > pics.length - 1 || currentIndex == positon) {
                return;
            }

            dots[positon].setEnabled(false);
            dots[currentIndex].setEnabled(true);

            currentIndex = positon;
        }

        //當滑動狀態改變時調用
        @Override
        public void onPageScrollStateChanged(int arg0) {
          if(arg0 == 0){
               if(lastValue == pics.length-1){
                   Toast.makeText(this, "已經是最後一張了", Toast.LENGTH_SHORT).show();
               }
           }            
        }

        //當前頁面被滑動時調用
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            lastValue = arg0;
        }

        //當新的頁面被選中時調用
        @Override
        public void onPageSelected(int arg0) {
            //設置底部小點選中狀態״̬
            setCurDot(arg0);
        }

        @Override
        public void onClick(View v) {
            int position = (Integer)v.getTag();
            setCurView(position);
            setCurDot(position);
        }
}

這個是佈局代碼:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        />    
    <LinearLayout 
        android:id="@+id/ll" 
        android:orientation="horizontal" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="24.0dip" 
        android:layout_alignParentBottom="true" 
        android:layout_centerHorizontal="true">

    </LinearLayout>

</RelativeLayout>

很簡單,有什麼不懂的可以來QQ羣找我
**請大家關注下我的微信公衆號:哦哦猿
QQ羣:552123831**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章