先上效果图:
先写一个Volley的请求的类:
public void fetchData() {
String url = "http://2.novelread.sinaapp.com/framework-sae/index.php";
// String body = "";
// try {
// mEntity = new StringEntity(body);
// } catch (UnsupportedEncodingException e1) {
// e1.printStackTrace();
// }
//如果发生错误,会进入这个监听
ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
};
<span style="white-space:pre"> </span>//如果请求得到的server的data,会进入这个方法
// Listener<String> listener = new Response.Listener<String>() {
//
// @Override
// public void onResponse(String message) {
// Log.d(TAG, "message ="+message);
// }
// };
RequestQueue requestQueue = Volley.newRequestQueue(mContext);
StringRequest request = new StringRequest(Request.Method.GET, url, mListener, errorListener) //构造request
{
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, "UTF-8");
return Response.success(jsonString,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (Exception je) {
return Response.error(new ParseError(je));
}
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("key", "value");
return headers;
}
@Override
public byte[] getPostBody() throws AuthFailureError {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
mEntity.writeTo(outputStream);
} catch (IOException e) {
Log.e(TAG, "IOException @ " + getClass().getSimpleName());
}
return outputStream.toByteArray();
}
@Override
public String getPostBodyContentType() {
return mEntity.getContentType().getValue();
}
}//重载的方法体
;
requestQueue.add(request);
}
在Activity里只要去解析数据然后放到ListView里就可以了
mListener = new Response.Listener<String>() {
@Override
public void onResponse(String message) {
Log.d(TAG, "message ="+message);
parseJson(message);
}
};
isShowListView(false);
GetDataViaVolley valley = GetDataViaVolley.getInstance(this);
valley.setListener(mListener);
valley.fetchData();
}
private void parseJson(String content) {
try {
JSONArray json = new JSONArray(content);
String str = "";
for (int i = 0; i < json.length(); i++) {
str = (String) json.getString(i);
JSONArray tempArray = (JSONArray) json.get(i);
ShopData data = new ShopData();
data.shopId = tempArray.getString(0);
data.name = tempArray.getString(1);
data.url = convert(tempArray.getString(2));
data.info = tempArray.getString(3);
mAdapter.items.add(data);
}
} catch (JSONException e) {
e.printStackTrace();
}
isShowListView(true);
mAdapter.notifyDataSetChanged();
}
private static String convert(String str) {
return str.replaceAll("\\\\", "");
}
private void isShowListView(Boolean flag) {
mListView.setVisibility(flag?View.VISIBLE:View.GONE);
loadingLayout.setVisibility(flag?View.GONE:View.VISIBLE);
}
图片加载用NetWorkImagView来实现,看ListView的item的Layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="56dp"
android:minHeight="56dp"
>
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/image_icon"
android:layout_width="@dimen/favorites_item_picture_width"
android:layout_height="@dimen/favorites_item_picture_height"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5dp"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="@dimen/messages_list_view_text_margin_left"
android:layout_toRightOf="@+id/image_icon"
android:background="@drawable/bg_list_item_divider"
>
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_marginTop="10dp"
android:ellipsize="marquee"
android:gravity="center_vertical|left"
android:singleLine="true"
android:textColor="#000000"
android:textSize="@dimen/font_size_medium" />
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_below="@id/name"
android:ellipsize="marquee"
android:gravity="center_vertical|left"
android:singleLine="true"
android:textColor="#000000"
android:textSize="@dimen/font_size_small" />
</RelativeLayout>
</RelativeLayout>
ListView的adapter的实现:
private void showImageByNetworkImageView(NetworkImageView imageView,String url){
RequestQueue requestQueue = Volley.newRequestQueueInDisk(this, "/sdcard/demo/", null);
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
imageView.setTag("url");
imageView.setDefaultImageResId(R.drawable.big_head_icon);
imageView.setImageUrl(url,imageLoader);
}
private class ListAdapter extends BaseAdapter{
protected List<ShopData> items = new ArrayList<ShopData>();
public ListAdapter(){
super();
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ShopDataTag tag = new ShopDataTag();//这个目的是重用convertView
if(convertView == null) {
convertView = mInflater.inflate(R.layout.listitem, null);
tag.name = (TextView)convertView.findViewById(R.id.name);
tag.shopInfo = (TextView)convertView.findViewById(R.id.info);
tag.icon = (NetworkImageView)convertView.findViewById(R.id.image_icon);
convertView.setTag(tag);
}else{
tag = (ShopDataTag)convertView.getTag();
}
TextView name = tag.name;
TextView info = tag.shopInfo;
NetworkImageView imageView = tag.icon;
ShopData data = items.get(position);
name.setText(data.name);
info.setText(data.info);
showImageByNetworkImageView(imageView, data.url);
return convertView;
}
}
private class ShopDataTag{
TextView name;
TextView shopInfo;
NetworkImageView icon;
}