Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(二)
来源:互联网 发布:windows系统的平板软件 编辑:程序博客网 时间:2024/04/27 15:28
项目结构如下:
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>() {@Overridepublic void onResponse(String response) {// TODO Auto-generated method stubcallBack.jsonStringCallBack(response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {timeOutCallBack.timeOutCallBack(error.getMessage());}}) {@Overrideprotected Response<String> parseNetworkResponse(NetworkResponse response) {String str = null;try {str = new String(response.data, "UTF-8");} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.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>() {@Overridepublic void onResponse(JSONArray response) {// TODO Auto-generated method stubcallBack.jsonArrayCallBack(response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// TODO Auto-generated method stubLog.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>() {@Overridepublic void onResponse(JSONObject response) {// TODO Auto-generated method stub// System.out.println("----->>response=" + response);callBack.jsonObjectCallBack(response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// TODO Auto-generated method stub}}){@Overrideprotected Map<String, String> getParams() throws AuthFailureError {return map;}@Overridepublic 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@Overrideprotected void entryRemoved(boolean evicted, String key,Bitmap oldValue, Bitmap newValue) {super.entryRemoved(evicted, key, oldValue, newValue);//如果为true为存满后 挤出来的if (evicted) {oldValue.recycle();oldValue = null;}}@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getRowBytes() * value.getHeight();}};@Overridepublic void putBitmap(String url, Bitmap bitmap) {// TODO Auto-generated method stubcache.put(url, bitmap);}@Overridepublic Bitmap getBitmap(String url) {// TODO Auto-generated method stubreturn 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; // 图中小圆点Groupprivate ImageView[] imageDots = null; // 小圆点数组集合// 假数据private String json_path = "http://open.cms.pcpop.com/Mobile/GetPop_Mobile.ashx?method=hand&Eid=8613&HandType=Index_pic#";@Overrideprotected 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() {@Overridepublic void jsonStringCallBack(String jsonString) {parseJsonImage(jsonString);System.out.println("---->>"+imageLists.get(0).getClickUrl()+"---->>");imageAdapter = new ImageAdapter(newImageViews);viewPager.setAdapter(imageAdapter); imageAdapter.notifyDataSetChanged();}}, new RequestTimeOutCallBack() {@Overridepublic 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
0 0
- Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(二)
- Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(一)
- ViewPager自动轮播+底部文字动态+底部小圆点动态滑动
- viewpager+自动轮播+无线轮播+小圆点
- 无限自动轮播+小圆点
- 自定义通用viewpager(左右无限滑动,自动轮播)
- ViewPager带底部圆点导航,实现自动轮播,无限滑动
- ViewPager 带小圆点 自动轮播
- ViewPager 带小圆点 自动轮播
- ViewPager自动轮播+小圆点
- viewpager自动轮播 加小圆点
- ViewPager 无限轮播 自动轮播
- ViewPager 无限轮播自动轮播
- ViewPager左右循环滑动+自动轮播
- 自动轮播+小圆点
- 小圆点自动轮播
- ViewPager无限自动轮播小圆点+网络加载图片+活动倒计时
- ViewPager实现自动轮播+手动添加小圆点的Mainactivity
- 删除服务器上的文件
- CSS中强大的EM
- 『IOS』Responder Chain(ios事件传递)
- android studio在真机运行中文乱码
- Android平台调用WebService详解(基于SOAP协议)
- Viewpager 自动轮播(无限循环) ,手动滑动时停止轮播+底部小圆点(二)
- iOS:编译错误[__NSDictionaryM objectAtIndexedSubscript:]: unrecognized selector sent to instance 0xa79e61
- Ubuntu下的PHP开发环境架设
- 关于cocos2dx 3.1 ListView 绿底白屏的问题
- 杭电OJ(HDOJ)2041题:超级阶梯(规律递推,Fibonacci)
- attempt to insert nil object from objects[1]' 错误
- linux操作常用命令
- IOS 归档 即序列化与反序列化
- java对redis的基本操作