List View not displaying remote images
I am using a HashMap to display images and text in a listview via a simpleAdapter. Now this works fine with images from my R.drawable. But as soon as I retrieve the image as a bitmap from a remote source, it doesn't display the image. The image is being downloaded correctly and it displays fine when I display it on a image view. Here is my code for retrieving an image and storing it in a bitmap variable:
user_picture=(ImageView)findViewById(R.id.widget89);
java.net.URL img_value = null;
try {
img_value = new java.net.URL("http://graph.facebook.com/XXXXXXX/picture?type=small");
} catch (Malformed开发者_StackOverflowURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
user_picture.setImageBitmap(mIcon1);
Any ideas why this is happening?
Thanks in advance Jannik
In recent projects, I have used the below class for fetching bitmaps and storing these in custom objects and using these for populating a ListView using an Adapter:
package com.octoshape.android.octopocplayer.playlist;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
public class BitmapDownloader extends AsyncTask<String, Void, Bitmap>{
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
URLConnection conn = url.openConnection();
conn.connect();
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
return bm;
} catch (IOException e) {}
return null;
}
}
Here is the Adapter:
private class VideoAdapter extends BaseAdapter {
@Override
public int getCount() {
return playList.size();
}
@Override
public Object getItem(int position) {
return playList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return ITEM_VIEW_TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (playList.get(position) instanceof String) ? ITEM_VIEW_TYPE_CHANNELSET
: ITEM_VIEW_TYPE_CHANNEL;
}
@Override
public boolean isEnabled(int position) {
// A separator cannot be clicked !
return getItemViewType(position) != ITEM_VIEW_TYPE_CHANNELSET;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int type = getItemViewType(position);
// First, let's create a new convertView if needed. You can also
// create a ViewHolder to speed up changes if you want ;)
if (convertView == null) {
final LayoutInflater inflater = LayoutInflater
.from(DemoPlayer.this);
final int layoutID = type == ITEM_VIEW_TYPE_CHANNELSET ? R.layout.separator_list_item
: R.layout.video_list_item;
convertView = inflater.inflate(layoutID, parent, false);
}
// We can now fill the list item view with the appropriate data.
if (type == ITEM_VIEW_TYPE_CHANNELSET) {
((TextView) convertView).setText((String) getItem(position));
} else {
final Channel channel = (Channel) getItem(position);
((TextView) convertView.findViewById(R.id.name))
.setText(channel.getName());
((ImageView) convertView.findViewById(R.id.logo))
.setImageResource(R.drawable.default);
if (channel.getChannelImage() != null)
((ImageView) convertView.findViewById(R.id.channellogo))
.setImageBitmap(channel.getChannelImage());
}
return convertView;
}
}
精彩评论