Android 我如何使用url将图像下载到自定义基础adapeter?

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

我使用url从后台进程获取图像。为了显示图像,我使用BaseAdapter显示列表中的所有图像。我已将BaseAdapter添加到我的listView中

我可以使用AsyncTask类在后台下载图像。这个类可以返回位图图像

我实现了MyCustome适配器类,如下所示

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方法中执行任务。那么这个问题就看不见了。

这是一个实现的简单演示,有没有其他的方法可以得到呢?惰性列表很难实现