Android 我如何使用url将图像下载到自定义基础adapeter?
我使用url从后台进程获取图像。为了显示图像,我使用BaseAdapter显示列表中的所有图像。我已将BaseAdapter添加到我的listView中 我可以使用AsyncTask类在后台下载图像。这个类可以返回位图图像 我实现了MyCustome适配器类,如下所示Android 我如何使用url将图像下载到自定义基础adapeter?,android,image,url,download,Android,Image,Url,Download,我使用url从后台进程获取图像。为了显示图像,我使用BaseAdapter显示列表中的所有图像。我已将BaseAdapter添加到我的listView中 我可以使用AsyncTask类在后台下载图像。这个类可以返回位图图像 我实现了MyCustome适配器类,如下所示 public class CustomeAdapter extends BaseAdapter { private static ArrayList<Message> searchArrayList; priva
public class CustomeAdapter extends BaseAdapter {
private static ArrayList<Message> searchArrayList;
private LayoutInflater mInflater;
public CustomeAdapter(Context context, ArrayList<Message> results) {
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list, null);
holder = new ViewHolder();
holder.personName = (TextView) convertView.findViewById(R.id.usrName);
holder.message = (TextView) convertView.findViewById(R.id.msgText);
holder.imgPerson = (ImageView) convertView.findViewById(R.id.personImg);
holder.msgImg = (ImageView) convertView.findViewById(R.id.msgImg);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.personName.setText(searchArrayList.get(position).getShoutUserFirstName());
holder.message.setText(searchArrayList.get(position).getShoutMessageText());
holder.msgImg.setImageResource(R.drawable.smile);
try{
new DownloadImageTask( holder.imgPerson).execute("http://www.bwappstore.com/WebApps/ShoutImage/Image.ashx?UserID="+searchArrayList.get(position).getShoutUserID());
}
catch (RejectedExecutionException e) {
e.printStackTrace();
}
return convertView;
}
static class ViewHolder {
TextView personName;
TextView message;
ImageView imgPerson;
ImageView msgImg;
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
Bitmap bm = null;
try {
URL aURL = new URL(urls[0]);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
}
catch (IOException e) {
Log.e("", "Error getting bitmap", e);
}
return bm;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
}
public类CustomeAdapter扩展BaseAdapter{
私有静态ArrayList searchArrayList;
私人停车场;
公共CustomeApter(上下文、ArrayList结果){
searchArrayList=结果;
mInflater=LayoutInflater.from(上下文);
}
public int getCount(){
返回searchArrayList.size();
}
公共对象getItem(int位置){
返回searchArrayList.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=mInflater.充气(R.layout.list,空);
holder=新的ViewHolder();
holder.personName=(TextView)convertView.findViewById(R.id.usrName);
holder.message=(TextView)convertView.findViewById(R.id.msgText);
holder.imgPerson=(ImageView)convertView.findViewById(R.id.personImg);
holder.msgImg=(ImageView)convertView.findViewById(R.id.msgImg);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.personName.setText(searchArrayList.get(position.getShoutUserFirstName());
holder.message.setText(searchArrayList.get(position.getShoutMessageText());
holder.msgImg.setImageResource(R.drawable.smile);
试一试{
新建下载的ImageTask(holder.imgPerson)。执行(“http://www.bwappstore.com/WebApps/ShoutImage/Image.ashx?UserID=“+searchArrayList.get(position.getShoutUserID());
}
捕获(拒绝执行异常e){
e、 printStackTrace();
}
返回视图;
}
静态类视窗夹{
TextView人名;
文本视图消息;
ImageView imgPerson;
ImageView msgImg;
}
私有类DownloadImageTask扩展了AsyncTask{
图像视图bmImage;
公共下载ImageTask(ImageView bmImage){
this.bmImage=bmImage;
}
受保护位图doInBackground(字符串…URL){
位图bm=null;
试一试{
URL aURL=新URL(URL[0]);
URLConnection conn=aURL.openConnection();
连接();
InputStream is=conn.getInputStream();
BufferedInputStream bis=新的BufferedInputStream(is);
bm=BitmapFactory.decodeStream(bis);
二、关闭();
is.close();
}
捕获(IOE异常){
Log.e(“,“获取位图时出错”,e);
}
返回bm;
}
受保护的void onPostExecute(位图结果){
bmImage.setImageBitmap(结果);
}
}
}
从实现中,我可以下载图像并在列表视图中显示,但当我滚动这些图像时,这些图像会发生变化。这些图像会一次又一次地加载,并在图像上过度加载,但不会加载相关消息图像
如果加载了一个图像,则不会再次加载。一段时间后,列表中只显示一个图像
如何加载一个图像一次,然后在列表中显示?
请任何人帮帮我,这是能帮你的。作者说,他与内存泄漏和性能作斗争。首先查看此库。问题在于您的逻辑 您正在适配器的getView方法中执行下载图像任务,每次滚动列表时都会调用该方法
所以,如果您的活动是,请尝试在onStart方法中执行任务。那么这个问题就看不见了。这是一个实现的简单演示,有没有其他的方法可以得到呢?惰性列表很难实现