我想将包含这些图像的url的json数据中的图像加载到listview中, 实现json数据的类具有以下代码:
ArrayList<HashMap<String,String>> mylist = new ArrayList<HashMap<String,String>>();
//JSONfunctions j1 = new JSONfunctions();
JSONObject j2=JSONfunctions.getJSONfromURL("/newwebsite/apis/index.php?device=iphone&api=store_list");
try{JSONArray myID=j2.getJSONArray("stores");
//JSONArray mc = json.getJSONArray("mc");
for(int i=0;i<myID.length();i++){
Log.v("state","json data being read");
JSONObject j3= myID.getJSONObject(i);
String name = j3.getString("StoreTitle");
JSONObject j4= myID.getJSONObject(i);
//String name2 = j4.getString("StoreLogo");
String imgurl = j4.getString("StoreLogo");
//map.put("img",+StoreLogo);
//URL newurl = new URL(j4.getString("StoreLogo"));
String name1 = j4.getString("Address");
Log.v("Address",name1);
Log.v("Storetitle",name);
HashMap<String,String> map=new HashMap<String,String>();
JSONObject im = myID.getJSONObject(i);
map.put("Id",String.valueOf(i));
map.put("Storename","Store"+j3.getString("StoreTitle"));
//map.put("img","http"+j3.getString("StoreLogo") );
mylist.add(map);
}}
catch(JSONException e){
Log.e("loG_tag","Error parsing"+e.toString());
}
list=(ListView)findViewById(R.id.mclist);
// WebAdapter jAdap=new WebAdapter(context);
ListAdapter adapter = new SimpleAdapter(this,mylist,R.layout.custom_row_view1,
new String[] {"Storename","add","img"},
new int[] {R.id.mCname,R.id.mCcity,R.id.mClogo});
list.setAdapter(adapter);
并且json数据的格式为
{"error":false,"totalresults":8,"stores":[{"StoreId":"38","StoreTitle":"Young & Jacksons","StoreLogo":"http:\/\/pocketdocket.com.au\/newwebsite\/uploads\/store\/1330635669night-young-and-jacksons-billboard.jpg","
其中StoreLogo是图像的网址。
非常感谢任何帮助。
答案 0 :(得分:1)
你已经加载了json解析图像。你有使用图像加载器。
Imageloader.java类
public class ImageLoader {
//the simplest in-memory cache implementation. This should be replaced with something like SoftReference or BitmapOptions.inPurgeable(since 1.6)
private HashMap<String, Bitmap> cache=new HashMap<String, Bitmap>();
private File cacheDir;
public ImageLoader(Context context){
//Make the background thead low priority. This way it will not affect the UI performance
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
//Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
final int stub_id=R.drawable.stub;
public void DisplayImage(String url, Activity activity, ImageView imageView)
{
if(cache.containsKey(url))
imageView.setImageBitmap(cache.get(url));
else
{
queuePhoto(url, activity, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, Activity activity, ImageView imageView)
{
//This ImageView may be used for other images before. So there may be some old tasks in the queue. We need to discard them.
photosQueue.Clean(imageView);
PhotoToLoad p=new PhotoToLoad(url, imageView);
synchronized(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}
//start thread if it's not started yet
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}
private Bitmap getBitmap(String url)
{
//I identify images by hashcode. Not a perfect solution, good for the demo.
String filename=String.valueOf(url.hashCode());
File f=new File(cacheDir, filename);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
DataInputStream input = null;
// InputStream is=new URL(url).openStream();
String auth = android.util.Base64.encodeToString(("devneoauto" + ":" + "2kk0rnpnpvir")
.getBytes("UTF-8"), android.util.Base64.NO_WRAP);
HttpClient client = new DefaultHttpClient();
HttpGet getmethod = new HttpGet(url);
getmethod.addHeader("Authorization", "Basic " + auth);
getmethod.addHeader("X-ZFWS-Accept", "text/json");
HttpResponse responseGet = client.execute(getmethod);
HttpEntity resEntityGet = responseGet.getEntity();
if (resEntityGet != null) {
input = new DataInputStream(responseGet.getEntity().getContent());
}
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(input, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE=70;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale++;
}
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
//Task for the queue
private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
PhotosQueue photosQueue=new PhotosQueue();
public void stopThread()
{
photoLoaderThread.interrupt();
}
//stores list of photos to download
class PhotosQueue
{
private Stack<PhotoToLoad> photosToLoad=new Stack<PhotoToLoad>();
//removes all instances of this ImageView
public void Clean(ImageView image)
{
for(int j=0 ;j<photosToLoad.size();){
if(photosToLoad.get(j).imageView==image)
photosToLoad.remove(j);
else
++j;
}
}
}
class PhotosLoader extends Thread {
public void run() {
try {
while(true)
{
//thread waits until there are any images to load in the queue
if(photosQueue.photosToLoad.size()==0)
synchronized(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0)
{
PhotoToLoad photoToLoad;
synchronized(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp=getBitmap(photoToLoad.url);
cache.put(photoToLoad.url, bmp);
if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
break;
}
} catch (InterruptedException e) {
//allow thread to exit
}
}
}
PhotosLoader photoLoaderThread=new PhotosLoader();
//Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
ImageView imageView;
public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
public void run()
{
if(bitmap!=null)
{
imageView.setImageBitmap(bitmap);
}
else
imageView.setImageResource(R.drawable.stub);
}
}
public void clearCache() {
//clear memory cache
cache.clear();
//clear SD cache
File[] files=cacheDir.listFiles();
for(File f:files)
f.delete();
}
}
此类使用此方法 imageloader.DisplayImage(UserSearchResponse.Book_image2.get(position),Book.this,Bookphoto);
where UsersearchResponse.Book.get(position) use for image url pasrsing for json
Book.this for where this Activity in class for example Book is class
Bookphoto for where this is ImageView
我确定这段代码可以帮助你