Viewpager 自動輪播(無限迴圈) ,手動滑動時停止輪播+底部小圓點(二)
阿新 • • 發佈:2019-01-04
專案結構如下:
Volley工具類:
VolleyTool類負責例項化mRequestQueue和mImageLoader。
JsonUtils 是解析json資料的工具類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; } }
ImageLoaderUtils圖片載入器,為其分配記憶體空間: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); } }
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