Android自定义组件ListView

下面代码设计了异步任务、JSon解析、自定义组件、IO流、文件下载、适配器原理等知识点。

代码实现从服务器上读取Json字符串。

Json字符串如下。

{object:{persons:[{name:’呵呵’,image:’http://10.0.159.12:8080/Web/s1.png’},{name:’哈哈’,image:’http://10.0.159.12:8080/Web/s1.png’},{name:’嘿嘿’,image:’http://10.0.159.12:8080/Web/s2.jpg’}]}}

利用ListView控件将name和image图片显示出来。效果如图:

思路(解析json字符串,然后再次读取服务器上的图片解析成byte[]格式。)

新建ImageInfo类存储ListView显示的数据:一个是显示名字name属性,一个图片数据。

package com.example.day22_domain;import java.util.Arrays;public class ImageInfo {private String name;private byte[] imagebit;public ImageInfo() {super();// TODO Auto-generated constructor stub}public ImageInfo(String name, byte[] imagebit) {super();this.name = name;this.imagebit = imagebit;}public String getName() {return name;}public void setName(String name) {this.name = name;}public byte[] getImagebit() {return imagebit;}public void setImagebit(byte[] imagebit) {this.imagebit = imagebit;}@Overridepublic String toString() {return "ImageInfo [name=" + name + ", imagebit="+ Arrays.toString(imagebit) + "]";}}写了一个工具类用来解析Json数据和图片:

package com.example.day22_tools;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.example.day22_domain.ImageInfo;public class HttpUtils {public HttpUtils() {}public static String getJsonString(String path){try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);conn.setDoInput(true);if(conn.getResponseCode()==200){InputStream inputStream = conn.getInputStream();return changetToString(inputStream);}}catch(Exception e){e.printStackTrace();}return null;}private static String changetToString(InputStream inputStream) {ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] arr = new byte[1024];int len = 0;try {while((len = inputStream.read(arr))!=-1){bos.write(arr,0,len);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] b = bos.toByteArray();String ss = new String(b,0,b.length);return ss;}public static List<ImageInfo> getImageInfo(String jsonString){List<ImageInfo> list = new ArrayList<ImageInfo>();try {JSONObject obj = new JSONObject(jsonString);JSONObject jsonObj = obj.getJSONObject("object");JSONArray array = jsonObj.getJSONArray("persons");for(int i=0;i<array.length();i++){ImageInfo image = new ImageInfo();JSONObject object = array.getJSONObject(i);image.setName(object.getString("name"));String imagepath=object.getString("image");byte[] data=getImageByte(imagepath);image.setImagebit(data);list.add(image);}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}public static byte[] getImageByte(String imagepath){ByteArrayOutputStream bos=null;try{URL url=new URL(imagepath);HttpURLConnection conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");conn.setDoInput(true);if(conn.getResponseCode()==200){InputStream inStream=conn.getInputStream();bos = new ByteArrayOutputStream();byte[] arr = new byte[1024];int len = 0;while((len = inStream.read(arr))!=-1){bos.write(arr,0,len);}}}catch(IOException e){e.printStackTrace();}byte[] b = bos.toByteArray();return b;}}主界面:通过异步任务进行后台下载图片解析Json数据,,然后显示在自定义的ListView组件中。

<span style="font-size:14px;">package com.example.day22_all;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.day22_domain.ImageInfo;import com.example.day22_tools.HttpUtils;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {private ListView listView;private String path=":8080/Web/servlet/JsonServlet";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.listView);new DownText().execute(path);}class DownText extends AsyncTask<String, Integer, List<Map<String, Object>>>{@Overrideprotected List<Map<String,Object>> doInBackground(String… params) {String jsonStr=HttpUtils.getJsonString(params[0]);System.out.println("jsonStr"+jsonStr);List<ImageInfo> list=HttpUtils.getImageInfo(jsonStr);System.out.println("ImageInfo");List<Map<String,Object>> imageinfo=new ArrayList<Map<String,Object>>();for(int i=0;i<list.size();i++){Map<String,Object> map=new HashMap<String, Object>();String name=list.get(i).getName();byte[] arr=list.get(i).getImagebit();Bitmap bitMap = BitmapFactory.decodeByteArray(arr, 0, arr.length);map.put("name", name);map.put("bitmap", bitMap);imageinfo.add(map);}return imageinfo;}@Overrideprotected void onPostExecute(List<Map<String,Object>> result) {super.onPostExecute(result);MyAdapter adapter = new MyAdapter(MainActivity.this,result);listView.setAdapter(adapter);}class MyAdapter extends BaseAdapter{private Context context;private List<Map<String, Object>> list;public MyAdapter(Context context, List<Map<String,Object>> list) {this.context = context;this.list = list;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if(convertView==null){</span><span style="font-size:14px;">convertView = LayoutInflater.from(context).inflate(R.layout.other_image, nuviewHolder = new ViewHolder();viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);viewHolder.textView = (TextView) convertView.findViewById(R.id.text);convertView.setTag(viewHolder);}elseviewHolder = (ViewHolder) convertView.getTag();//viewHolder.imageView.setImageResource(Integer.parseInt(list.get(position).get("bitmap").toString()));viewHolder.textView.setText(list.get(position).get("name").toString());viewHolder.imageView.setImageBitmap((Bitmap)list.get(position).get("bitmap"));return convertView;}class ViewHolder{ImageView imageView;TextView textView;}}}}</span><span style="font-size:18px;"></span>注释:

来说是非者,便是是非人。

Android自定义组件ListView

相关文章:

你感兴趣的文章:

标签云: