public class HeadImage {
private String IndexArtid;
private String IndexImgurl;
private String clickUrl;
private int artType;
public String getIndexArtid() {
return IndexArtid;
}
public void setIndexArtid(String indexArtid) {
IndexArtid = indexArtid;
}
public String getIndexImgurl() {
return IndexImgurl;
}
public void setIndexImgurl(String indexImgurl) {
IndexImgurl = indexImgurl;
}
public String getClickUrl() {
return clickUrl;
}
public void setClickUrl(String clickUrl) {
this.clickUrl = clickUrl;
}
public int getArtType() {
return artType;
}
public void setArtType(int artType) {
this.artType = artType;
}
}
package com.example.android_atuoviewpager;
import java.lang.ref.WeakReference;
import android.os.Handler;
import android.os.Message;
public class ImageHandler extends Handler{
/**
* 请求更新显示的View。
*/
protected static final int MSG_UPDATE_IMAGE = 1;
/**
* 请求暂停轮播。
*/
protected static final int MSG_KEEP_SILENT = 2;
/**
* 请求恢复轮播。
*/
protected static final int MSG_BREAK_SILENT = 3;
/**
* 记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。
* 例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页,
* 则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。
*/
protected static final int MSG_PAGE_CHANGED = 4;
//轮播间隔时间
protected static final long MSG_DELAY = 8000;
//使用弱引用避免Handler泄露.这里的泛型参数可以不是Activity,也可以是Fragment等
private WeakReference<MainActivity> weakReference;
private int currentItem = 0;
protected ImageHandler(WeakReference<MainActivity> wk){
weakReference = wk;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// Log.d(LOG_TAG, "receive message " + msg.what);
MainActivity activity = weakReference.get();
if (activity==null){
//Activity已经回收,无需再处理UI了
return ;
}
//检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。
if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){
activity.handler.removeMessages(MSG_UPDATE_IMAGE);
}
switch (msg.what) {
case MSG_UPDATE_IMAGE:
currentItem++;
activity.viewPager.setCurrentItem(currentItem);
//准备下次播放
activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_KEEP_SILENT:
//只要不发送消息就暂停了
break;
case MSG_BREAK_SILENT:
activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_PAGE_CHANGED:
//记录当前的页号,避免播放的时候页面显示不正确。
currentItem = msg.arg1;
break;
default:
break;
}
}
}
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;
}
}
}
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;
}
}
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;
}
}
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);
}
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="240dip">
<android.support.v4.view.ViewPager
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<LinearLayout
android:id="@+id/point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20.0dip"
android:layout_gravity="center_horizontal|bottom"
android:orientation="horizontal">
</LinearLayout>
</FrameLayout>