使用Volley来写一个List列表(Valley可以解决很大一部分android请求server的问题)

先上效果图:

先写一个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来写一个List列表(Valley可以解决很大一部分android请求server的问题),布布扣,bubuko.com

时间: 2024-10-14 00:06:30

使用Volley来写一个List列表(Valley可以解决很大一部分android请求server的问题)的相关文章

写一个scrapy中间件--ip代理池

# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # https://docs.scrapy.org/en/latest/topics/spider-middleware.html import random from scrapy import signals class TutorialDownloaderMiddleware(object

如何使用viewpager与fragment写一个app导航activity

今天我们来看一下如何使用viewpager和fragment组合来写一个app导航activity,这里使用到了android开源控件viewpagerindicator,有兴趣的同学可以去它网站上看看它的介绍. 附上效果截图一张: demo中只有一个activity,是用activity_main.xml来布局,其内容如下: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:and

转---写一个网页进度loading

作者:jack_lo www.jianshu.com/p/4c93f5bd9861 如有好文章投稿,请点击 → 这里了解详情 loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达.最常见的比如"转圈圈","省略号"等等. 网页loading有很多用处,比如页面的加载进度,数据的加载过程等等,数据的加载loading很好做,只需要在加载数据之前(before aja

教你写一个可快速复用定制的小键盘输入控件

引子 在Android项目开发中特别是一些稍大型的项目,面对需求文档的时候你经常会发现很多地方用到了同样的组件,但是又略有不同.比如这个: 右边是一个小键盘输入板,左边当焦点不同的时候分别用右边的小键盘输入板来输入内容,同时发现很多别的地方也用到了这个小键盘输入板. 按照以往的做法,我们可能这样子来做出这么一个控件: 写一个小键盘的布局单独存为一个layout文件 在用到这个小键盘的activity/fragment中的layout布局中include这个小键盘布局文件 在activity/fr

如果写一个列表点击一张图片来preview这张图片

可以才用继承AlertDialog的形式来写: 点击张图: public void onClick(View v) { viewBigsizeBmp(((ImageView) v).getDrawable(), Constants.PREVIEW_BMP_DIR_SUFFIX); } private void viewBigsizeBmp(Drawable drawable, String suffix) { final String sdDir = Utils.getSDPath(); fin

Cocos2D iOS之旅:如何写一个敲地鼠游戏(八):为动画建立属性列表

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 在之前的博文中,我们创建了游戏的基础 - 小可爱的地鼠从洞中呼之欲出.我们花了大量的时间思考关于如何组织素材以及坐标置位,以让我们的游戏在iphone,ipad以及高清屏上看

20190125-找到列表第二大的数以及自己写一个冒泡排序

1. 给定一个列表,找出列表第二大的值 思路:考虑列表是可能是乱序列表,并且可能存在两个相等的最大值的情况. s1 = [34,33,2,1,6,7,7,44,3,23,23] 解法1:去重(解决可能存在两个相等的最大值),然后使用sort排序,然后然后通过切片取到第二大的值.tip,一定要先去重再排序,如果先排序再去重可能会打乱序列 s1 = [34,33,2,1,6,7,7,44,3,23,23] s2 = list(set(s1)) s2.sort() print(s2[-2]) #s2[

用weexplus从0到1写一个app(2)-页面跳转和文章列表及文章详情的编写

说明 结束连续几天的加班,最近的项目终于告一段落,今天抽点时间开始继续写我这篇拖了很久的<用weexplus从0到1写一个app>系列文章.写这篇文章的时候,weexplus的作者已经把weexplus重构了一下,可以同时打包出web端和native端,我这边的ui界面和项目结构也跟着做了一点变化.这里有weexplus官方放出的一个电影APP的demo,有需要的可以去下载看看,然后顺便给weexplus一个star吧! 文章可能会很长,在此分几篇文章来写,先占个坑: 用weexplus从0到

利用列表的知识写一个购物小程序

利用列表,写一个购物小程序,实现显示商品,显示余额,显示购物车的商品,可以随时退出. 1 product_list = [ 2 ('Mac', 9000), 3 ('Kindle', 800), 4 ('tesla', 900000), 5 ('python book', 105), 6 ('bike', 2000), 7 ] 8 9 saving = input('please input your money:') 10 shopping_car = [] 11 if saving.isdi