3

我是android的初学者..我想显示来自JSON的文本和图像...在这里我可以显示文本但不能显示图像...有人可以帮助我吗?

This is my JSON : 
   { 
     " countries":[
          {"countryname":"India",
            "flag":"http://******.in/p/demo1/india.png" },

          {"countryname":"****",
            "flag":"http://******.in/p/demo1/*****.png" },

           ...........................................and so on

         ]
   }

在这里我可以显示国家名称,但无法显示图像(标志) ......国家名称和显示在列表视图中的标志......如果我点击任何项目,它必须显示国家名称及其另一个活动中的标志....我得到国家名称,但没有图像视图中的标志....

这是我的代码:

      public class AndroidJSONParsingActivity extends ListActivity {

      // url to make request
      private static String url = "http://*****@#$$$@#$.in/p/demo1/first.php/countries";

     // JSON Node names
     private static final String TAG_COUNTRIES = "countries";

     private static final String TAG_COUNTRYNAME = "countryname";
     private static final String TAG_FLAG= "flag";          


     JSONArray countries = null;


     @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);


 // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

      // Creating JSON Parser instance
      JSONParser jParser = new JSONParser();

      // getting JSON string from URL
      JSONObject json = jParser.getJSONFromUrl(url);



    try {

            // Getting Array of Contacts
        countries = json.getJSONArray(TAG_COUNTRIES);

        // looping through All Contacts
        for(int i = 0; i < countries.length(); i++){
            JSONObject c = countries.getJSONObject(i);

            // Storing each json item in variable
            String name = c.getString(TAG_COUNTRYNAME);
            String flag= c.getString(TAG_FLAG);


                // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_COUNTRYNAME, id);
            map.put(TAG_LANGUAGE, name);
            map.put(TAG_CAPITAL, email);

            // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


            ListAdapter adapter = new SimpleAdapter(this, contactList,R.layout.list_item,
     new String[] { TAG_COUNTRYNAME, TAG_FLAG}, new int[] {
                    R.id.country_name, R.id.flag});

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String country_name = ((TextView) view.findViewById(R.id.countyr_name)).getText().toString();
            String flag= ((ImageView) view.findViewById(R.id.flag)).getTag().toString();


            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_COUNTRYNAME, country_name);
            in.putExtra(TAG_FLAG, flag);

            startActivity(in);

        }
    });


     }


     }
4

3 回答 3

3

您必须从 JSON 中提取图像的链接并发出另一个下载请求。

于 2013-06-05T08:18:19.030 回答
0

您的 Activity 课程将是这样的。

public class SingleMenuItemActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Extracting string from intent
    String urlString = getIntent().getStringExtra("flag");
    ImageLoaderTask imageLoaderTask = new ImageLoaderTask();
    imageLoaderTask.execute(urlString);
}

private class ImageLoaderTask extends AsyncTask<String, Void, Drawable> {
    @Override
    protected Drawable doInBackground(String... imageUrls) {
        Drawable image = null;
        try {
            String url = imageUrls[0];
            if (null != url) {
                image = getDrawable(url);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
        return image;
    }

    protected void onPostExecute(Drawable drawable) {
        if (drawable != null) {
            ImageView imageView = (ImageView)findViewById(R.id.view);
            imageView.setBackgroundDrawable(drawable);
        }
    }
}

/**
 * @param address URL
 * @return Drawable
 */
private Drawable getDrawable(String address) {
    try {
        URL url = new URL(address);
        InputStream is = (InputStream)url.getContent();
        Drawable d = Drawable.createFromStream(is, "src");
        return d;
    } catch (MalformedURLException e) {
        return null;
    } catch (IOException e) {
        return null;
    }
}
}

这里 AsyncTask 用于在单独的线程上处理将 StringURL 转换为 ImageView 背景的 Drawable。

希望对你有帮助....:)

于 2013-06-05T08:46:20.193 回答
0

打开您的主要活动并输入以下代码。每当您想显示来自 url 的图像时,只需调用以下代码:

     ImageLoader imgLoader = new ImageLoader(getApplicationContext());
     imgLoader.DisplayImage(image_url, loader, image);

// image_url - 是图片的url路径

// loader - 加载图片,将在加载图片之前显示

// 图像 - 是 ImageView

ImageLoader.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

public class ImageLoader {

    MemoryCache memoryCache=new MemoryCache();
    FileCache fileCache;
    private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
    ExecutorService executorService;

    public ImageLoader(Context context){
        fileCache=new FileCache(context);
        executorService=Executors.newFixedThreadPool(5);
    }

    int stub_id = R.drawable.ic_launcher;
    public void DisplayImage(String url, int loader, ImageView imageView)
    {
        stub_id = loader;
        imageViews.put(imageView, url);
        Bitmap bitmap=memoryCache.get(url);
        if(bitmap!=null)
            imageView.setImageBitmap(bitmap);
        else
        {
            queuePhoto(url, imageView);
            imageView.setImageResource(loader);
        }
    }

    private void queuePhoto(String url, ImageView imageView)
    {
        PhotoToLoad p=new PhotoToLoad(url, imageView);
        executorService.submit(new PhotosLoader(p));
    }

    private Bitmap getBitmap(String url)
    {
        File f=fileCache.getFile(url);

        //from SD cache
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;

        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, 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*=2;
            }

            //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;
        }
    }

    class PhotosLoader implements Runnable {
        PhotoToLoad photoToLoad;
        PhotosLoader(PhotoToLoad photoToLoad){
            this.photoToLoad=photoToLoad;
        }

        @Override
        public void run() {
            if(imageViewReused(photoToLoad))
                return;
            Bitmap bmp=getBitmap(photoToLoad.url);
            memoryCache.put(photoToLoad.url, bmp);
            if(imageViewReused(photoToLoad))
                return;
            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
            Activity a=(Activity)photoToLoad.imageView.getContext();
            a.runOnUiThread(bd);
        }
    }

    boolean imageViewReused(PhotoToLoad photoToLoad){
        String tag=imageViews.get(photoToLoad.imageView);
        if(tag==null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }

    //Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable
    {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;
        public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
        public void run()
        {
            if(imageViewReused(photoToLoad))
                return;
            if(bitmap!=null)
                photoToLoad.imageView.setImageBitmap(bitmap);
            else
                photoToLoad.imageView.setImageResource(stub_id);
        }
    }

    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }

}

文件缓存.java

import java.io.File;
import android.content.Context;

public class FileCache {

    private File cacheDir;

    public FileCache(Context context){
        //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(),"TempImages");
        else
            cacheDir=context.getCacheDir();
        if(!cacheDir.exists())
            cacheDir.mkdirs();
    }

    public File getFile(String url){
        String filename=String.valueOf(url.hashCode());
        File f = new File(cacheDir, filename);
        return f;

    }

    public void clear(){
        File[] files=cacheDir.listFiles();
        if(files==null)
            return;
        for(File f:files)
            f.delete();
    }

}

MemoryCache.java

import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.graphics.Bitmap;

public class MemoryCache {
    private Map<String, SoftReference<Bitmap>> cache=Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());

    public Bitmap get(String id){
        if(!cache.containsKey(id))
            return null;
        SoftReference<Bitmap> ref=cache.get(id);
        return ref.get();
    }

    public void put(String id, Bitmap bitmap){
        cache.put(id, new SoftReference<Bitmap>(bitmap));
    }

    public void clear() {
        cache.clear();
    }
}

实用程序.java

import java.io.InputStream;
import java.io.OutputStream;

public class Utils {
    public static void CopyStream(InputStream is, OutputStream os)
    {
        final int buffer_size=1024;
        try
        {
            byte[] bytes=new byte[buffer_size];
            for(;;)
            {
              int count=is.read(bytes, 0, buffer_size);
              if(count==-1)
                  break;
              os.write(bytes, 0, count);
            }
        }
        catch(Exception ex){}
    }
}
于 2013-06-05T09:55:02.163 回答