使用Volley来写一个List列表(Valley可以解决很大一部分android请求server的问题)
2014-07-08 15:13
495 查看
先上效果图:
![](http://img.blog.csdn.net/20140715103738213)
先写一个Volley的请求的类:
在Activity里只要去解析数据然后放到ListView里就可以了
图片加载用NetWorkImagView来实现,看ListView的item的Layout:
ListView的adapter的实现:
代码可以在http://download.csdn.net/detail/baidu_nod/7606877下载
先写一个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; }
代码可以在http://download.csdn.net/detail/baidu_nod/7606877下载
相关文章推荐
- 使用Volley请求数据,并使用Gson解析(解决请求来的数据乱码问题)
- 只有一个公网IP也可以使用LVS的DR模式!(外带php session粘滞问题解决)
- Android 使用volley过程中遇到的问题解决办法
- 关于使用ajax请求servletList转换Json抛的异常There is a cycle in the hierarchy!暨将List转换为JSONArray问题解决!
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三).so文件编译过程问题的解决
- android列表中使用MediaPlayer播放视频的一个问题
- <c:foreach>解决遍历一个list创建多行多列列表的问题
- 使用Apache 的 FTP Client获取FTP服务器上的文件列表FTP response 421 received.Server closed connection问题的解决
- 接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)
- 只有一个公网IP也可以使用LVS的DR模式!(外带php session粘滞问题解决)
- 由Volley使用HttpURLConnection请求所引起的问题的解决过程
- 使用eclipse进行Android编程发生崩溃的一个问题及解决办法
- [Android]浮层视频效果,在另外一个Window使用SurfaceView无法正常显示的问题排查与解决
- Android 使用get请求时汉字乱码问题解决
- 使用eclipse进行Android编程发生崩溃的一个问题及解决办法
- 使用Apache 的 FTP Client获取FTP服务器上的文件列表FTP response 421 received.Server closed connection问题的解决
- FMDB多线程读写问题,使用FMDataBaseQueue操作可以解决同时打开一个链接de读写问题
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 使用session时候,遇到的一个问题(请求解决方法)
- Android 用Json解析请求图片写的一个ViewPager广告轮播 , 带滑动小圆点 ,完美解决了三张图片引起的滑动问题