Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義組件ListView

Android自定義組件ListView

編輯:關於Android編程

下面代碼設計了異步任務、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;
	}


	@Override
	public 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 block
			e.printStackTrace();
		}
		
		byte[] b = bos.toByteArray();
		String ss = new String(b,0,b.length);
		return ss;
	}
	
	public static List getImageInfo(String jsonString)
	{
		List list = new ArrayList();
		try {
			JSONObject obj = new JSONObject(jsonString);
			JSONObject jsonObj = obj.getJSONObject(object);
			JSONArray array = jsonObj.getJSONArray(persons);
			for(int i=0;i

主界面:通過異步任務進行後台下載圖片解析Json數據,然後顯示在自定義的ListView組件中。

 

 

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=http://10.0.159.12:8080/Web/servlet/JsonServlet;
	@Override
	protected 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>>
	{
		
		@Override
		protected List> doInBackground(String... params) {
			String jsonStr=HttpUtils.getJsonString(params[0]);
			System.out.println(jsonStr+jsonStr);
			List list=HttpUtils.getImageInfo(jsonStr);
			System.out.println(ImageInfo);
			List> imageinfo=new ArrayList>();
			for(int i=0;i map=new HashMap();
				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;
		}
		@Override
		protected void onPostExecute(List> result) {
			
			super.onPostExecute(result);
			
			MyAdapter  adapter = new MyAdapter(MainActivity.this,result);
			
			listView.setAdapter(adapter);
			
		}
		
		class MyAdapter extends BaseAdapter
		{
			private Context context;
			private List> list;
			public MyAdapter(Context context, List> list) {
				this.context = context;
				this.list = list;
			}

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return list.size();
			}

			@Override
			public Object getItem(int position) {
				// TODO Auto-generated method stub
				return list.get(position);
			}

			@Override
			public long getItemId(int position) {
				// TODO Auto-generated method stub
				return position;
			}

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				ViewHolder viewHolder = null;
				if(convertView==null)
				{
					convertView = LayoutInflater.from(context).inflate(R.layout.other_image, nu
					viewHolder = new ViewHolder();
					viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);
					viewHolder.textView = (TextView) convertView.findViewById(R.id.text);
					convertView.setTag(viewHolder);
				}
				else
					viewHolder = (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;
	    }
			
		}
	}
	
}
注釋:

 

/*
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件,並且實例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
LayoutInflater 是一個抽象類,在文檔中如下聲明:
public abstract class LayoutInflater extends Object
獲得 LayoutInflater 實例的三種方式
1. LayoutInflater inflater = getLayoutInflater();//調用Activity的getLayoutInflater()
2. LayoutInflater inflater = LayoutInflater.from(context);
3. LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
其實,這三種方式本質是相同的,從源碼中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
public PhoneWindow(Context context)
{
super(context);
mLayoutInflater = LayoutInflater.from(context);
}
可以看出它其實是調用 LayoutInflater.from(context)。
LayoutInflater.from(context):
public static LayoutInflater from(Context context)
{
LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null)
{
throw new AssertionError(LayoutInflater not found.);
}
return LayoutInflater;
}
可以看出它其實調用 context.getSystemService()。
結論:所以這三種方式最終本質是都是調用的Context.getSystemService()。
注意:
·inflate 方法與 findViewById 方法不同;
·inflater 是用來找 res/layout 下的 xml 布局文件,並且實例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。
*/

寫一下布局文件和服務器就好了:

activity_main.xml

 

 

 

 


 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved