2013-06-05 2 views
3

Я начинаю с android .. Я хочу отобразить текст и изображение из JSON ... Здесь я могу отображать текст, но не изображение ... Может ли кто-нибудь мне помочь? ??как показать изображение с объекта 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 

     ] 
    } 

Здесь я могу отобразить COUNTRYNAME, но косяк, способный отображать изображения (флаг) ... Страну имени и отображаемый в виде в списке флаг .... если я нажимаю по любому вопросу, он должен показать название страны и ее флаг в aonther деятельности .... я получить название страны, но не флаг в ImageView ....

Вот мой код:

 public class AndroidJSONParsingActivity extends ListActivity { 

     // url to make request 
     private static String url = "http://*****@#[email protected]#$.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); 

     } 
    }); 


    } 


    } 

ответ

2

Вы должны извлечь ссылку с изображения из JSON и сделать еще один запрос на ее загрузку.

0

Класс вашей деятельности будет таким.

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 фона.

Надеется, что это поможет .... :)

+0

Vishesh чандра: У меня есть ошибка в этой строке ** Строка флага = ((ImageView) view.findViewById (R.id.flag)). getTag(). toString(); ** в моей ** AndroidJSONParsingActivity ** ... Любая идея ... –

+0

что это за ошибка? –

+0

** getTag() ** .... см. Приведенную выше строку ... изображение в строку и переход к следующему действию ... thats the error .. –

0

Откройте основную деятельность и введите следующий код. Всякий раз, когда вы хотите показать изображение из URL просто вызовите следующий код:

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

// IMAGE_URL - это изображение пути URL

// погрузчик - погрузчик изображение будет показан перед загрузкой изображения

// изображение - это 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){} 
    } 
} 
+0

Ваш код работает отлично .... мы используем только один URL-адрес image в ur code .... но мой вопрос состоял в том, что мы хотим показать изображения из объектов JSON ... –

+0

@NaveenR Насколько я помню, я использовал этот же класс ImageLoader для загрузки нескольких изображений из json и просмотра в listview в проекте. Модификация этого немного справится с этой задачей. Если я смогу получить точный код, я отправлю его. – fida1989

+0

k fida ... Спасибо u !! –

Смежные вопросы