3

Am beginner to android.. I want to display the text and an image from JSON... Here i can able to display the text but not the image... Can anybody help me ??

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

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

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

         ]
   }

Here i can display the countryname, but cant able to display the image (flag)... Country name and the flag displayed in a list view....if i click on any item, it has to show a country name and its flag in aonther activity.... i get country name but not the flag in imageview....

Here my code :

      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);

        }
    });


     }


     }

3 Answers 3

3

You have to extract the link of the image from JSON and make another request to download it.

Sign up to request clarification or add additional context in comments.

Comments

0

Your Activity class will be like this.

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

Here AsyncTask is used for process on separate thread to conversion of StringURL to Drawable for ImageView background.

Hope this will help you....:)

2 Comments

vishesh chandra : I have error on this line String flag= ((ImageView) view.findViewById(R.id.flag)).getTag().toString(); in my AndroidJSONParsingActivity... Any idea...
getTag()....see the above line...image to string and pass to next activity...thats the error..
0

Open your main activity and type the following code. Whenever you want to show an image from url just call the following code:

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

// image_url - is image url path

// loader - loader image, will be shown before loading image

// image - is 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();
    }

}

FileCache.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();
    }
}

Utils.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){}
    }
}

2 Comments

Your code works fine....we use only a single URL image in ur code.... but my question was we want to show the images from JSON Objects...
@NaveenR As far as I remember, I used this same ImageLoader class to load multiple images from a json and view in listview in a project. Modifying it a little bit will do the job. If I can get the exact code, I will post it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.