1. 程式人生 > >Viewpager 自動輪播(無限迴圈) ,手動滑動時停止輪播+底部小圓點(二)

Viewpager 自動輪播(無限迴圈) ,手動滑動時停止輪播+底部小圓點(二)

專案結構如下:


Volley工具類:

VolleyTool類負責例項化mRequestQueue和mImageLoader。

package com.example.utils;

import android.content.Context;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

public class VolleyTool {
	private static VolleyTool mInstance = null;
	private RequestQueue mRequestQueue;
	private ImageLoader mImageLoader;
	
	private VolleyTool(Context context){
		mRequestQueue = Volley.newRequestQueue(context);
		mImageLoader = ImageLoaderUtils.getImageLoader(mRequestQueue);
	}
	
	public static VolleyTool getInstance(Context context){
		if (mInstance==null) {
			mInstance = new VolleyTool(context);
		}
		return mInstance;
	}

	public RequestQueue getmRequestQueue() {
		return mRequestQueue;
	}

	public ImageLoader getmImageLoader() {
		return mImageLoader;
	}

	public void release() {
		this.mImageLoader = null;
		this.mRequestQueue = null;
		mInstance = null;
	}

}
JsonUtils 是解析json資料的工具類
package com.example.utils;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;

public class JsonUtils {

	/**
	 * 解析json資料的工具類
	 * 
	 * @param context
	 * @param json_path
	 * @param callBack
	 * @param queue
	 */
	public static void parseJsonString(Context context, String json_path,
			final JsonStringCallBack callBack,
			final RequestTimeOutCallBack timeOutCallBack, RequestQueue queue) {
		StringRequest request = new StringRequest(json_path,
				new Listener<String>() {
					@Override
					public void onResponse(String response) {
						// TODO Auto-generated method stub
						callBack.jsonStringCallBack(response);
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {
						timeOutCallBack.timeOutCallBack(error.getMessage());
					}
				}) {
			@Override
			protected Response<String> parseNetworkResponse(
					NetworkResponse response) {
				String str = null;
				try {
					str = new String(response.data, "UTF-8");
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return Response.success(str,
						HttpHeaderParser.parseCacheHeaders(response));
			}
		};

		request.setRetryPolicy(new DefaultRetryPolicy(4000,
				DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
				DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

		// 新增到佇列中
		queue.add(request);
	}

	/**
	 * 解析陣列開始的json字串
	 * 
	 * @param context
	 * @param json_path
	 * @param callBack
	 * @param queue
	 */
	public static void parseJsonArray(Context context, String json_path,
			final JsonArrayCallBack callBack, RequestQueue queue) {
		JsonArrayRequest request = new JsonArrayRequest(json_path,
				new Listener<JSONArray>() {
					@Override
					public void onResponse(JSONArray response) {
						// TODO Auto-generated method stub
						callBack.jsonArrayCallBack(response);
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {
						// TODO Auto-generated method stub
						Log.i("TAG", error.getMessage());
					}
				});
		// 新增到佇列中
		queue.add(request);
	}

	/**
	 * 
	 * @param context
	 * @param json_path
	 * @param callBack
	 */
	public static void parseJsonObject(Context context, String json_path,
			final Map<String, String> map, final JsonObjectCallBack callBack,
			RequestQueue queue) {
		JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
				Request.Method.POST, json_path, null,
				new Response.Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject response) {
						// TODO Auto-generated method stub
						// System.out.println("----->>response=" + response);
						callBack.jsonObjectCallBack(response);
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {
						// TODO Auto-generated method stub

					}

				})

		{
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				return map;
			}

			@Override
			public Map<String, String> getHeaders() throws AuthFailureError {
				HashMap<String, String> headers = new HashMap<String, String>();
				headers.put("Accept", "application/json");
				headers.put("Content-Type", "application/json; charset=UTF-8");
				return headers;

			}
		};
		queue.add(jsonObjectRequest);
	}

	// 解析json物件的回撥介面
	public interface JsonObjectCallBack {
		public void jsonObjectCallBack(JSONObject jsonObject);

	}

	// 解析json陣列的回撥介面
	public interface JsonArrayCallBack {
		public void jsonArrayCallBack(JSONArray jsonArray);
	}

	// 解析json字串的回撥介面
	public interface JsonStringCallBack {
		public void jsonStringCallBack(String jsonString);
	}
	// 請求超時的回撥介面
	public interface RequestTimeOutCallBack {
		public void timeOutCallBack(String timeOutString);
	}
}
ImageLoaderUtils圖片載入器,為其分配記憶體空間:
package com.example.utils;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;

public class ImageLoaderUtils {

	private static ImageLoader imageLoader;

	public static ImageLoader getImageLoader(RequestQueue requestQueue) {	
		if (imageLoader == null) {//單例模式
			imageLoader = new ImageLoader(requestQueue, new ImageCache() {
				
				
				private LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(
						(int) Runtime.getRuntime().maxMemory() / 4) {//因圖片很多故在此處為4,本應為8

					@Override
					protected void entryRemoved(boolean evicted, String key,
							Bitmap oldValue, Bitmap newValue) {
						super.entryRemoved(evicted, key, oldValue, newValue);
						//如果為true為存滿後 擠出來的
						if (evicted) {
							oldValue.recycle();
							oldValue = null;
						}
					}

					@Override
					protected int sizeOf(String key, Bitmap value) {
						return value.getRowBytes() * value.getHeight();
						
					}

				};

				@Override
				public void putBitmap(String url, Bitmap bitmap) {
					// TODO Auto-generated method stub
					cache.put(url, bitmap);
				}

				@Override
				public Bitmap getBitmap(String url) {
					// TODO Auto-generated method stub
					return cache.get(url);
				}
			});
		}
		return imageLoader;
	}
	
	public static void LetImageLoaderToGc(){
		imageLoader=null;
	}
}

MainActivity類如下:

package com.example.android_atuoviewpager;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import com.android.volley.toolbox.NetworkImageView;
import com.example.utils.JsonUtils;
import com.example.utils.VolleyTool;
import com.example.utils.JsonUtils.JsonStringCallBack;
import com.example.utils.JsonUtils.RequestTimeOutCallBack;

import android.os.Bundle;
import android.os.Message;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout.LayoutParams;

public class MainActivity extends Activity {

	private static final String LOG_TAG = "MainActivity";  
    public ImageHandler handler = new ImageHandler(new WeakReference<MainActivity>(this));  
    public ViewPager viewPager; 
    private ImageAdapter imageAdapter;
    ArrayList<NetworkImageView> newImageViews;
    private List<HeadImage> imageLists;
    private NetworkImageView networkImageView;
    private ViewGroup group; // 圖中小圓點Group
	private ImageView[] imageDots = null; // 小圓點陣列集合
	
	// 假資料
	private String json_path = "http://open.cms.pcpop.com/Mobile/GetPop_Mobile.ashx?method=hand&Eid=8613&HandType=Index_pic#";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		  setContentView(R.layout.activity_main);  
	        //初始化iewPager的內容  
	        viewPager = (ViewPager) findViewById(R.id.main_viewpager);  
	        group = (ViewGroup) findViewById(R.id.point_group);
	        parseImageData();
	        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
	               
	            //配合Adapter的currentItem欄位進行設定。  
	            @Override  
	            public void onPageSelected(int arg0) {  
	                handler.sendMessage(Message.obtain(handler, ImageHandler.MSG_PAGE_CHANGED, arg0, 0));  
	                int currentPosition = arg0 % newImageViews.size();
	    			for (int i = 0; i < newImageViews.size(); i++) {
	    				imageDots[currentPosition]
	    						.setBackgroundResource(R.drawable.test_greenicon);
	    				if (currentPosition != i) {
	    					imageDots[i]
	    							.setBackgroundResource(R.drawable.test_grayicon);
	    				}
	    			}
	            }  
	               
	            @Override  
	            public void onPageScrolled(int arg0, float arg1, int arg2) {  
	            }  
	               
	            //覆寫該方法實現輪播效果的暫停和恢復  
	            @Override  
	            public void onPageScrollStateChanged(int arg0) {  
	                switch (arg0) {  
	                case ViewPager.SCROLL_STATE_DRAGGING:  
	                    handler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);  
	                    break;  
	                case ViewPager.SCROLL_STATE_IDLE:  
	                    handler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);  
	                    break;  
	                default:  
	                    break;  
	                }  
	            }  
	        });  
	        viewPager.setCurrentItem(Integer.MAX_VALUE/2);//預設在中間,使使用者看不到邊界  
	        //開始輪播效果  
	        handler.sendEmptyMessageDelayed(ImageHandler.MSG_BREAK_SILENT, ImageHandler.MSG_DELAY);  
	    }

	private void parseImageData() {
		JsonUtils.parseJsonString(this, json_path,
				new JsonStringCallBack() {

					@Override
					public void jsonStringCallBack(String jsonString) {
						parseJsonImage(jsonString);
						System.out.println("---->>"+imageLists.get(0).getClickUrl()+"---->>");
						imageAdapter = new ImageAdapter(newImageViews);
						viewPager.setAdapter(imageAdapter); 
						imageAdapter.notifyDataSetChanged();
					}
				}, new RequestTimeOutCallBack() {

					@Override
					public void timeOutCallBack(String timeOutString) {
						
					}
				}, VolleyTool.getInstance(this).getmRequestQueue());
	}
	/**
	 * 解析首頁焦點圖資料
	 * 
	 * @param jsonString
	 *            獲取到的json字串
	 * @return
	 */
	private List<HeadImage> parseJsonImage(String jsonString) {
		imageLists = new ArrayList<HeadImage>();
		newImageViews = new ArrayList<NetworkImageView>();
		try {
			JSONObject jsonObject = new JSONObject(jsonString)
					.getJSONObject("info");
			JSONArray jsonArray = jsonObject.getJSONArray("infolist");
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject jsonElement = jsonArray.getJSONObject(i);
				HeadImage headImage = new HeadImage();
				headImage.setIndexArtid(jsonElement.getString("IndexArtid"));
				headImage.setIndexImgurl(jsonElement.getString("IndexImgurl"));
				headImage.setClickUrl(jsonElement.getString("ClickUrl"));
				headImage.setArtType(jsonElement.getInt("ArtType"));
				imageLists.add(headImage);
			}
			for (int i = 0; i < imageLists.size(); i++) {
				networkImageView = new NetworkImageView(this);
				networkImageView.setScaleType(ScaleType.FIT_XY);
				networkImageView
						.setDefaultImageResId(R.drawable.ic_launcher);
				networkImageView.setImageUrl(
						imageLists.get(i).getIndexImgurl(), VolleyTool
								.getInstance(this).getmImageLoader());
				newImageViews.add(networkImageView);
			}
			group.removeAllViews();
			imageDots = new ImageView[imageLists.size()];
			for (int i = 0; i < imageDots.length; i++) {
				imageDots[i] = new ImageView(this);
				// 設定引數
				LayoutParams params = new LayoutParams(15, 15);
				params.gravity = Gravity.CENTER_HORIZONTAL;
				params.setMargins(6, 0, 6, 0);
				imageDots[i].setLayoutParams(params);
				imageDots[i].setPadding(20, 0, 20, 0);
				if (i == 0) {
					imageDots[i]
							.setBackgroundResource(R.drawable.test_greenicon);
				} else {
					imageDots[i]
							.setBackgroundResource(R.drawable.test_grayicon);
				}
				group.addView(imageDots[i]);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return imageLists;
	}

	public class ImageAdapter extends PagerAdapter {

		private ArrayList<NetworkImageView> viewlist ;  
		   
	    public ImageAdapter(ArrayList<NetworkImageView> viewlist) {  
	        this.viewlist = viewlist;  
	    }  

	    @Override  
	    public int getCount() {  
	        //設定成最大,使使用者看不到邊界  
	        return Integer.MAX_VALUE;  
	    }  

	    @Override  
	    public boolean isViewFromObject(View arg0, Object arg1) {  
	        return arg0==arg1;  
	    }  
	     @Override    
	     public void destroyItem(ViewGroup container, int position,    
	             Object object) {    
	         //Warning:不要在這裡呼叫removeView  
	     }    
	     @Override    
	     public Object instantiateItem(ViewGroup container, int position) {  
	         //對ViewPager頁號求模取出View列表中要顯示的項  
	         position %= viewlist.size();  
	         if (position<0){  
	             position = viewlist.size()+position;  
	         }  
	         ImageView view = viewlist.get(position);  
	         //如果View已經在之前新增到了一個父元件,則必須先remove,否則會丟擲IllegalStateException。  
	         ViewParent vp =view.getParent();  
	         if (vp!=null){  
	             ViewGroup parent = (ViewGroup)vp;  
	             parent.removeView(view);  
	         }  
	         container.addView(view);    
	         //add listeners here if necessary  
	         return view;    
	     } 
	}
}

原始碼下載地址:

http://download.csdn.net/detail/shr957250701/8168307