Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从列表视图中的URL加载图像_Java_Android_Listview - Fatal编程技术网

Java 从列表视图中的URL加载图像

Java 从列表视图中的URL加载图像,java,android,listview,Java,Android,Listview,我可以下载图像并在ListView中显示它。但我面临的问题是, 当我加载图像时,它们都会加载到列表的第一行。它显示正在第一行中逐个加载。而其他行保留默认图像。看起来很奇怪。怎么办。代码如下: private class simpsync extends AsyncTask<String, Integer , Bitmap>{ private final WeakReference imageViewReference;

我可以下载图像并在ListView中显示它。但我面临的问题是, 当我加载图像时,它们都会加载到列表的第一行。它显示正在第一行中逐个加载。而其他行保留默认图像。看起来很奇怪。怎么办。代码如下:

            private class simpsync extends AsyncTask<String, Integer , Bitmap>{
                private final WeakReference imageViewReference;
                simpsync(ImageView iv){
                    //imageView=iv;
                    imageViewReference=new WeakReference(iv);

                }
                @Override
                protected Bitmap doInBackground(String... param) {

                    Bitmap bmp=CommonFunctions.overlay(CommonFunctions.loadUrlBitmap(param[0]));
                    return bmp;
                }
                  protected void onPostExecute(Bitmap bitmap) {

                      //imageView.setImageBitmap(result);
                      if (isCancelled()) {
                            bitmap = null;
                        }
                        if (imageViewReference != null) {
                            ImageView imageView = (ImageView) imageViewReference.get();
                            if (imageView != null) {

                                if (bitmap != null) {
                                    imageView.setImageBitmap(bitmap);
                                }
                                }
                            }
                  }
            }
私有类simpsync扩展异步任务{
私有最终WeakReference imageViewReference;
simpsync(ImageView iv){
//imageView=iv;
imageViewReference=新的WeakReference(iv);
}
@凌驾
受保护位图doInBackground(字符串…参数){
位图bmp=CommonFunctions.overlay(CommonFunctions.loadUrlBitmap(param[0]);
返回bmp;
}
受保护的void onPostExecute(位图){
//设置图像位图(结果);
如果(isCancelled()){
位图=空;
}
if(imageViewReference!=null){
ImageView ImageView=(ImageView)imageViewReference.get();
如果(imageView!=null){
if(位图!=null){
设置图像位图(位图);
}
}
}
}
}
这段代码是BaseAdapter类的getView函数

            public View getView(int position, View convertView, ViewGroup parent) {

                View vi = convertView;
                ViewHolder holder;

                if(convertView==null){

                    /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
                    //list_book_detail_entry
                    if(requestType==SearchAndIndex.SEARCH_IN_SEPAERATE)
                    {
                        vi = inflater.inflate(R.layout.list_book_detail_buy, parent, false);
                        //vi = inflater.inflate(R.layout.list_book_detail_buy, null);
                    }
                    else{
                        vi = inflater.inflate(R.layout.list_book_detail_entry, parent, false);
                        //vi = inflater.inflate(R.layout.list_book_detail_entry, parent, false);
                    }


                    /****** View Holder Object to contain tabitem.xml file elements ******/

                    holder = new ViewHolder();

                    holder.bookTitle=(TextView)vi.findViewById(R.id.BookTitle);
                    holder.writer = (TextView) vi.findViewById(R.id.WriterName);
                    holder.imageUrl=(ImageView)vi.findViewById(R.id.ImageUrl);
                    holder.isbn=(TextView)vi.findViewById(R.id.BookISBN);
                    holder.serialNumber=(TextView)vi.findViewById(R.id.BookSerialNumber);
                    holder.availabilityView=(ImageView)vi.findViewById(R.id.AvailabilityView);
                    holder.publisher=(TextView)vi.findViewById(R.id.Publisher);
                    holder.publishingDate=(TextView)vi.findViewById(R.id.PublishingDate);
                    /************  Set holder with LayoutInflater ************/
                    vi.setTag( holder );
                }
                else 
                    holder=(ViewHolder)vi.getTag();

                if(data.size()<=0)
                {
                    holder.bookTitle.setText("--");
                    holder.writer.setText("--");
                    holder.publisher.setText("--");
                    holder.publisher.setText("----+--+--");
                }
                else
                {
                    tempValues=null;
                    tempValues = ( BookDetailsStruct ) data.get( position );
                    holder.writer.setText( tempValues.Writer );
                    holder.publisher.setText(tempValues.Publisher);
                    holder.publishingDate.setText(tempValues.getIssueDetail(0).publishingDate);

                    simpsync sp=new simpsync(holder.imageUrl);
                    if(requestType==SearchAndIndex.SEARCH_IN_SEPAERATE)
                     {
                         if(tempValues.getIssueDetail(0)!=null)
                         {
                             String toAdd;
                             if(tempValues.getIssueDetail(0).serialNumber==-1)
                                 toAdd="";
                             else
                                 toAdd=" [ 巻"+tempValues.getIssueDetail(0).serialNumber+" ]";
                             holder.bookTitle.setText( tempValues.BookName+toAdd);
                             sp.execute(tempValues.getIssueDetail(0).smallImageUrl);
                         }
                     }
                     else{
                         if(tempValues.largetNumberIndex!=-1)
                         {
                             String toAdd;
                             if(tempValues.getIssueDetail(tempValues.largetNumberIndex).serialNumber==-1)
                                 toAdd="";
                             else
                                 toAdd=" ("+tempValues.getIssueCount()+"巻)";
                             holder.bookTitle.setText( tempValues.BookName+toAdd);
                             sp.execute(tempValues.getIssueDetail(tempValues.largetNumberIndex).smallImageUrl);
                         }
                         else{
                             holder.bookTitle.setText( tempValues.BookName);
                             sp.execute(tempValues.getIssueDetail(0).smallImageUrl);
                         }
                     }
                     vi.setOnClickListener(new OnItemClickListener( position ));
                }
                return vi;

            }
public View getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
视窗座;
if(convertView==null){
/******为每行(定义如下)膨胀tabitem.xml文件*******/
//列表\书籍\详细信息\条目
if(requestType==SearchAndIndex.SEARCH\u IN\u separate)
{
vi=充气机。充气(R.layout.list\u book\u detail\u buy,parent,false);
//vi=充气机。充气(R.layout.list\u book\u detail\u buy,空);
}
否则{
vi=充气机。充气(R.布局.列表\书本\详细信息\条目,父项,错误);
//vi=充气机。充气(R.布局.列表\书本\详细信息\条目,父项,错误);
}
/******要包含tabitem.xml文件元素的视图持有者对象******/
holder=新的ViewHolder();
holder.bookTitle=(TextView)vi.findViewById(R.id.bookTitle);
holder.writer=(TextView)vi.findViewById(R.id.WriterName);
holder.imageUrl=(ImageView)vi.findViewById(R.id.imageUrl);
holder.isbn=(TextView)vi.findViewById(R.id.BookISBN);
holder.serialNumber=(TextView)vi.findViewById(R.id.BookSerialNumber);
holder.availabilityView=(ImageView)vi.findViewById(R.id.availabilityView);
holder.publisher=(TextView)vi.findViewById(R.id.publisher);
holder.publishingDate=(TextView)vi.findViewById(R.id.publishingDate);
/************带压平机的固定架************/
vi.setTag(支架);
}
其他的
holder=(ViewHolder)vi.getTag();
if(data.size()可用于将图像加载到ListView

@Override 
public void getView(int position, View convertView, ViewGroup parent) {
  SquaredImageView view = (SquaredImageView) convertView;
  if (view == null) {
    view = new SquaredImageView(context);
  }
  String url = getItem(position);

  Picasso.with(context).load(url).into(view);
}

在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:

  • 适配器中处理
    ImageView
    回收和下载取消
  • 使用最少内存的复杂图像转换
  • 自动内存和磁盘缓存
  • 您可以使用将图像加载到ListView中

    @Override 
    public void getView(int position, View convertView, ViewGroup parent) {
      SquaredImageView view = (SquaredImageView) convertView;
      if (view == null) {
        view = new SquaredImageView(context);
      }
      String url = getItem(position);
    
      Picasso.with(context).load(url).into(view);
    }
    

    在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:

  • 适配器中处理
    ImageView
    回收和下载取消
  • 使用最少内存的复杂图像转换
  • 自动内存和磁盘缓存
  • 您可以使用将图像加载到ListView中

    @Override 
    public void getView(int position, View convertView, ViewGroup parent) {
      SquaredImageView view = (SquaredImageView) convertView;
      if (view == null) {
        view = new SquaredImageView(context);
      }
      String url = getItem(position);
    
      Picasso.with(context).load(url).into(view);
    }
    

    在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:

  • 适配器中处理
    ImageView
    回收和下载取消
  • 使用最少内存的复杂图像转换
  • 自动内存和磁盘缓存
  • 您可以使用将图像加载到ListView中

    @Override 
    public void getView(int position, View convertView, ViewGroup parent) {
      SquaredImageView view = (SquaredImageView) convertView;
      if (view == null) {
        view = new SquaredImageView(context);
      }
      String url = getItem(position);
    
      Picasso.with(context).load(url).into(view);
    }
    

    在Android上加载图像的许多常见陷阱都是由毕加索自动处理的:

  • 适配器中处理
    ImageView
    回收和下载取消
  • 使用最少内存的复杂图像转换
  • 自动内存和磁盘缓存
  • “问题”是ListView的循环行为。你没有充分尊重它。当你向下滚动,一个视图在顶部消失时,它将在底部重新使用(这就是为什么你使用ViewHolder模式,这很好)。但是你也启动了一个异步任务,给它ImageView并保留它。因为行的整个视图(由于imageview)被回收,它将不符合垃圾收集的条件,因此asynctask有一个有效的imageview,可以在完成后显示图像

    为了更正您的代码,我建议您只需修改android开发者页面上所写的内容,这几乎就是复制过去的代码供您使用:

    您也可以使用第三方库,因为其他聪明人也遇到了这个问题,并提出了很好的解决方案:

  • 它们都有一个非常(非常)简单的Api来完成任务,并且它们都是高效的和可调的,并且已经有了很好的设置