首先客户端从服务器端获取json数据
1、利用HttpUrlConnection
/** * 从指定的URL中获取数组 * @param urlPath * @return * @throws Exception */ public static String readParse(String urlPath) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream inStream = conn.getInputStream(); while ((len = inStream.read(data)) != -1) { outStream.write(data, 0, len); } inStream.close(); return new String(outStream.toByteArray());//通过out.Stream.toByteArray获取到写的数据 }
2、利用HttpClient
/** * 访问数据库并返回JSON数据字符串 * * @param params 向服务器端传的参数 * @param url * @return * @throws Exception */ public static String doPost(List<NameValuePair> params, String url) throws Exception { String result = null; // 获取HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 新建HttpPost对象 HttpPost httpPost = new HttpPost(url); if (params != null) { // 设置字符集 HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8); // 设置参数实体 httpPost.setEntity(entity); } /*// 连接超时 httpClient.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 3000); // 请求超时 httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 3000);*/ // 获取HttpResponse实例 HttpResponse httpResp = httpClient.execute(httpPost); // 判断是够请求成功 if (httpResp.getStatusLine().getStatusCode() == 200) { // 获取返回的数据 result = EntityUtils.toString(httpResp.getEntity(), "UTF-8"); } else { Log.i("HttpPost", "HttpPost方式请求失败"); } return result; }
其次Json数据解析:
json数据: [{"id":"67","biaoTi":"G","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741845270.png","logoLunbo":"http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg","yuanJia":"0","xianJia":"0"},{"id":"64","biaoTi":"444","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741704400.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741738500.png","yuanJia":"0","xianJia":"0"},{"id":"62","biaoTi":"jhadasd","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741500450.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741557450.png","yuanJia":"1","xianJia":"0"}]
/** * 解析 * * @throws JSONException */ private static ArrayList<HashMap<String, Object>> Analysis(String jsonStr) throws JSONException { /******************* 解析 ***********************/ JSONArray jsonArray = null; // 初始化list数组对象 ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); jsonArray = new JSONArray(jsonStr); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); // 初始化map数组对象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("logo", jsonObject.getString("logo")); map.put("logoLunbo", jsonObject.getString("logoLunbo")); map.put("biaoTi", jsonObject.getString("biaoTi")); map.put("yuanJia", jsonObject.getString("yuanJia")); map.put("xianJia", jsonObject.getString("xianJia")); map.put("id", jsonObject.getInt("id")); list.add(map); } return list; }
最后数据适配:
1、TextView
/** * readParse(String)从服务器端获取数据 * Analysis(String)解析json数据 */ private void resultJson() { try { allData = Analysis(readParse(url)); Iterator<HashMap<String, Object>> it = allData.iterator(); while (it.hasNext()) { Map<String, Object> ma = it.next(); if ((Integer) ma.get("id") == id) { biaoTi.setText((String) ma.get("biaoTi")); yuanJia.setText((String) ma.get("yuanJia")); xianJia.setText((String) ma.get("xianJia")); } } } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
2、ListView:
/** * ListView 数据适配 */ private void product_data(){ List<HashMap<String, Object>> lists = null; try { lists = Analysis(readParse(url));//解析出json数据 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); for(HashMap<String, Object> news : lists){ HashMap<String, Object> item = new HashMap<String, Object>(); item.put("chuXingTianShu", news.get("chuXingTianShu")); item.put("biaoTi", news.get("biaoTi")); item.put("yuanJia", news.get("yuanJia")); item.put("xianJia", news.get("xianJia")); item.put("id", news.get("id")); try { bitmap = ImageService.getImage(news.get("logo").toString());//图片从服务器上获取 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(bitmap==null){ Log.i("bitmap", ""+bitmap); Toast.makeText(TravelLine.this, "图片加载错误", Toast.LENGTH_SHORT) .show(); // 显示图片编号 } item.put("logo",bitmap); data.add(item); } listItemAdapter = new MySimpleAdapter1(TravelLine.this,data,R.layout.a_travelline_item, // 动态数组与ImageItem对应的子项 new String[] { "logo", "biaoTi", "xianJia", "yuanJia", "chuXingTianShu"}, // ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] { R.id.trl_ItemImage, R.id.trl_ItemTitle, R.id.trl_ItemContent, R.id.trl_ItemMoney, R.id.trl_Itemtoday}); listview.setAdapter(listItemAdapter); //添加点击 listview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { login_publicchannel_trl_sub(arg2); } }); }
对于有图片的要重写适配器
package com.nuoter.adapterUntil; import java.util.HashMap; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Paint; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MySimpleAdapter1 extends BaseAdapter { private LayoutInflater mInflater; private List<HashMap<String, Object>> list; private int layoutID; private String flag[]; private int ItemIDs[]; public MySimpleAdapter1(Context context, List<HashMap<String, Object>> list, int layoutID, String flag[], int ItemIDs[]) { this.mInflater = LayoutInflater.from(context); this.list = list; this.layoutID = layoutID; this.flag = flag; this.ItemIDs = ItemIDs; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return 0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(layoutID, null); // convertView = mInflater.inflate(layoutID, null); for (int i = 0; i < flag.length; i++) {//备注1 if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) { ImageView imgView = (ImageView) convertView.findViewById(ItemIDs[i]); imgView.setImageBitmap((Bitmap) list.get(position).get(flag[i]));///关键是这句!!!!!!!!!!!!!!! }else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) { TextView tv = (TextView) convertView.findViewById(ItemIDs[i]); tv.setText((String) list.get(position).get(flag[i])); }else{ //...备注2 } } //addListener(convertView); return convertView; } /* public void addListener(final View convertView) { ImageView imgView = (ImageView)convertView.findViewById(R.id.lxs_item_image); } */ }
对于图片的获取,json解析出来的是字符串url:"logoLunbo":http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg 从url获取 图片
ImageService工具类
package com.nuoter.adapterUntil; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImageService { /** * 获取网络图片的数据 * @param path 网络图片路径 * @return */ public static Bitmap getImage(String path) throws Exception{ /*URL url = new URL(imageUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); mBitmap = BitmapFactory.decodeStream(is);*/ Bitmap bitmap= null; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection();//基于HTTP协议连接对象 conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ InputStream inStream = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(inStream); } return bitmap; } /** * 读取流中的数据 从url获取json数据 * @param inStream * @return * @throws Exception */ public static byte[] read(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len = inStream.read(buffer)) != -1){ outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } }
上面也将从url处获取网络数据写在了工具类ImageService中方面调用,因为都是一样的。
当然也可以在Activity类中写一个获取服务器图片的函数(当用处不多时)
/* * 从服务器取图片 * 参数:String类型 * 返回:Bitmap类型 */ public static Bitmap getHttpBitmap(String urlpath) { Bitmap bitmap = null; try { //生成一个URL对象 URL url = new URL(urlpath); //打开连接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); // conn.setConnectTimeout(6*1000); // conn.setDoInput(true); conn.connect(); //得到数据流 InputStream inputstream = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(inputstream); //关闭输入流 inputstream.close(); //关闭连接 conn.disconnect(); } catch (Exception e) { Log.i("MyTag", "error:"+e.toString()); } return bitmap; }
调用:
public ImageView pic; ..... ..... allData=Analysis(readParse(url)); Iterator<HashMap<String, Object>> it=allData.iterator(); while(it.hasNext()){ Map<String, Object> ma=it.next(); if((Integer)ma.get("id")==id) { logo=(String) ma.get("logo"); bigpic=getHttpBitmap(logo); } } pic.setImageBitmap(bigpic);
另附 下载数据很慢时建立子线程并传参:
new Thread() { @Override public void run() { // 参数列表 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("currPage", Integer .toString(1))); nameValuePairs.add(new BasicNameValuePair("pageSize", Integer .toString(5))); try { String result = doPost(nameValuePairs, POST_URL); Message msg = handler.obtainMessage(1, 1, 1, result); handler.sendMessage(msg); // 发送消息 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); // 定义Handler对象 handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1:{ // 处理UI StringBuffer strbuf = new StringBuffer(); List<HashMap<String, Object>> lists = null; try { lists = MainActivity.this .parseJson(msg.obj.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); for(HashMap<String, Object> news : lists){ HashMap<String, Object> item = new HashMap<String, Object>(); item.put("id", news.get("id")); item.put("ItemText0", news.get("name")); try { bitmap = ImageService.getImage(news.get("logo").toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(bitmap==null){ Log.i("bitmap", ""+bitmap); Toast.makeText(MainActivity.this, "图片加载错误", Toast.LENGTH_SHORT) .show(); // 显示图片编号 } item.put("ItemImage",bitmap); data.add(item); } //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 MySimpleAdapter saImageItems = new MySimpleAdapter(MainActivity.this, data, R.layout.d_travelagence_item, new String[] {"ItemImage", "ItemText0", "ItemText1"}, new int[] {R.id.lxs_item_image, R.id.lxs_item_text0, R.id.lxs_item_text1}); //添加并且显示 gridview.setAdapter(saImageItems); } break; default: break; } } };