简体   繁体   中英

If no images in json response then display default image and data in listview

I am able to display images and data in listview obtained from parsing json. Now i have a problem if there is no images in json response then i want to display default image along with data in listview, but now output is empty not even data is display without image. How can i solve this Any solution will be appreciated. following is code

ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();


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

            // getting JSON string from URL
            JSONObject json = jParser.getJSONFromUrl(URL);
            try {
        JSONArray posts = json.getJSONArray(KEY_POSTS);

    // looping through all song nodes <song>
            for(int i = 0; i < posts.length(); i++){
                JSONObject c = posts.getJSONObject(i);
                // Storing each json item in variable
                String id = c.getString(KEY_ID);
                String title = c.getString(KEY_TITLE);
                String date = c.getString(KEY_DATE);
                String content = c.getString(KEY_CONTENT);

                //authornumber is agin  JSON Object
                JSONObject author = c.getJSONObject(KEY_AUTHOR);
                String name = author.getString(KEY_NAME);

                JSONArray atta = c.getJSONArray("attachments");
                for(int j = 0; j < atta.length(); j++){

                    JSONObject d = atta.getJSONObject(j);

                    String slug = d.getString(KEY_SLUG);

                    JSONObject images = d.getJSONObject(KEY_IMAGES);

                    JSONObject thumbnail = images.getJSONObject(KEY_THUMB_URL);
                    String url = thumbnail.getString(KEY_URL);



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

        // adding each child node to HashMap key => value
        map.put(KEY_ID, id);
        map.put(KEY_TITLE, title);
        map.put(KEY_DATE, date);
        map.put(KEY_NAME, name);
        map.put(KEY_CONTENT, content);
        map.put(KEY_SLUG, slug);
        map.put(KEY_URL, url);


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

                }


    list=(ListView)findViewById(R.id.list);

    // Getting adapter by passing json data ArrayList
    adapter=new LazyAdapter(this, songsList);        
    list.setAdapter(adapter);

LazyAdapter.java

public class LazyAdapter extends BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView title = (TextView)vi.findViewById(R.id.title); // title
    TextView date = (TextView)vi.findViewById(R.id.artist); // artist name
    TextView content = (TextView)vi.findViewById(R.id.duration);  // duration
    TextView name = (TextView)vi.findViewById(R.id.name); 
    // duration
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);


    ListView list;
    // Setting all values in listview
   title.setText(song.get(CustomizedListView.KEY_TITLE));
    date.setText(song.get(CustomizedListView.KEY_DATE));
    content.setText(song.get(CustomizedListView.KEY_CONTENT));
    name.setText(song.get(CustomizedListView.KEY_NAME));

   imageLoader.DisplayImage(song.get(CustomizedListView.KEY_URL), thumb_image);
    return vi;
  }
 }

ImageLoader.java

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

final int stub_id = R.drawable.no_image;
public void DisplayImage(String url, ImageView imageView)
{
    imageViews.put(imageView, url);
    Bitmap bitmap=memoryCache.get(url);
    System.out.println("Image bitmap object from url*********$$$$$$$$"+bitmap);

    if(bitmap!=null)
        imageView.setImageBitmap(bitmap);
    else
    {
      System.out.println("In the else where there is null bitmap>>>>>>>>>");
        queuePhoto(url, imageView);
        imageView.setImageResource(stub_id);
    }
}

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

  }

use this Method instead of LazyAdapter's getView() for display default image.

        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;

            LayoutInflater vi = LayoutInflater.from(this.ctx);
            if (convertView == null) {
                try {
                    convertView = vi.inflate(
                            R.layout.siteselectionlistinflater, null);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                    e.getMessage();
                }
                holder = new ViewHolder();

holder.title = (TextView) convertView.findViewById(R.id.title); // title
    holder.date = (TextView) convertView.findViewById(R.id.artist); // artist name
   holder.content = (TextView) convertView.findViewById(R.id.duration);  // duration
    holder.name = (TextView) convertView.findViewById(R.id.name); 
    // duration
   holder.thumb_image=(ImageView) convertView.findViewById(R.id.list_image); 


                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }           
         HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);


    ListView list;
    // Setting all values in listview
   title.setText(song.get(CustomizedListView.KEY_TITLE));
    date.setText(song.get(CustomizedListView.KEY_DATE));
    content.setText(song.get(CustomizedListView.KEY_CONTENT));
    name.setText(song.get(CustomizedListView.KEY_NAME));

  if(song.get(CustomizedListView.KEY_URL) != null && song.get(CustomizedListView.KEY_URL).compareTo("")!=0)
    {
         imageLoader.DisplayImage(song.get(CustomizedListView.KEY_URL), thumb_image);
    }
    else{

          thumb_image.setImageResource(R.drawable.DEFAULT_IMAGE);
    }

            return convertView;
        }

       class ViewHolder {
            TextView title;
            TextView date;
            TextView content;
                TextView name;
                 ImageView thumb_image;

        }

There can be two ways two solve this issue.. 1. If you are following the lazyloader than there is file in that ie ImageLoader.java, overthere there is this method..

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

in the above code the stub_id is your default image which gets set when the url is not proper or if there is no image for that url in your cache. So you can set any defulat image by changing the stub_id from your drawable.

Another solution is that. 2. While parsing the JSONNObject you can check if there is any image url available, if not than set default image string overthere. something like this..

if(thumbnail.has("KEY_URL")){
    String url = thumbnail.getString(KEY_URL);
}else{
    String url = --- string path of your default image;
}

Try it.! it may help you. All the best.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM