Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Android 如何将图像加载到列表视图适配器中的正确行中_Android_Image_Listview_Android Asynctask_Adapter - Fatal编程技术网

Android 如何将图像加载到列表视图适配器中的正确行中

Android 如何将图像加载到列表视图适配器中的正确行中,android,image,listview,android-asynctask,adapter,Android,Image,Listview,Android Asynctask,Adapter,在以下情况下:使用异步任务的替代方案是什么? private void loadImage(final ImageView photo, String imageUrl) { new AsyncTask<String, String, Bitmap>() { @Override protected Bitmap doInBackground(String... param) { try

在以下情况下:使用异步任务的替代方案是什么?

private void loadImage(final ImageView photo, String imageUrl) {
        new AsyncTask<String, String, Bitmap>() {

            @Override
            protected Bitmap doInBackground(String... param) {
                try {
                    Bitmap b = callToServer(imageUrl);//takes long
                    return b;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap ret) {
                if (ret != null) {
                    photo.setImageBitmap(ret);
                }
            }

        }.execute(imageUrl);

    }
我正在使用AsyncTask将图像加载到适配器中。适配器行有多个TextView和一个ImageView。ImageView是我加载图像的地方。正在从internet加载图像。问题是当我滚动时,错误的图像会显示在一行/单元格中——直到正确的图像到达为止。如何防止图像不匹配的情况发生?我问这个问题是因为我想了解它是如何工作的:我不只是想得到一些可能为我做这项工作的库(我已经尝试过的许多库都失败了)

问题再次出现:AsyncTask导致图像加载到错误的行中,以便用户可以清楚地看到图像正在寻找其最终目的地

我希望问题是清楚的。为了完整起见,下面是我在适配器的
getView
方法中调用的方法,用于加载每个图像。该方法也位于适配器内部使用异步任务的替代方案是什么?

private void loadImage(final ImageView photo, String imageUrl) {
        new AsyncTask<String, String, Bitmap>() {

            @Override
            protected Bitmap doInBackground(String... param) {
                try {
                    Bitmap b = callToServer(imageUrl);//takes long
                    return b;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap ret) {
                if (ret != null) {
                    photo.setImageBitmap(ret);
                }
            }

        }.execute(imageUrl);

    }
private void loadImage(最终图像视图照片,字符串图像URL){
新建异步任务(){
@凌驾
受保护位图doInBackground(字符串…参数){
试一试{
位图b=callToServer(imageUrl);//需要很长时间
返回b;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onPostExecute(位图ret){
如果(ret!=null){
photo.setImageBitmap(ret);
}
}
}.execute(imageUrl);
}

最常见的方法是使用在适配器中创建的视图的setTag(…)和getTag(…)方法。创建后,添加一个标记,该标记需要链接到随后异步加载的图像。当该任务完成时,您可以检查视图的标记,如果它仍然与异步任务启动时相同,则可以设置映像。否则,可以忽略图像。请记住,滚动时会重复使用相同的视图,而不是创建相同的视图。那么标签就变了


这里有一个很好的例子:

最常见的方法是使用在适配器中创建的视图的setTag(…)和getTag(…)方法。创建后,添加一个标记,该标记需要链接到随后异步加载的图像。当该任务完成时,您可以检查视图的标记,如果它仍然与异步任务启动时相同,则可以设置映像。否则,您可以关闭该图像。请记住,滚动时会重复使用相同的视图,而不是创建相同的视图。那么标签就变了


这里有一个很好的例子:

问题是行被回收,图像视图也被回收。然后,当服务器响应返回时,图像视图已经属于另一个数据对象

对此有不同的方法。我的解决方案是扩展ImageView并跟踪要加载的图像

class RemoteImageView extends ImageView {
   private String _uri;

   public synchronized void loadRemoteImage(String uri) {
       _uri = uri;
       loadImage(this, uri) ; //this is your async call
   }

  private synchronized void onImageLoaded(String uri, Bitmap image) {
       if(uri.equals(_uri)) {  //this will set only the correct image
            setImageBitmap(image);
       }
  } 

}
至于你的加载功能:

private void loadImage(final ImageView photo, final String imageUrl) {
        new AsyncTask<String, String, Bitmap>() {

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

                    Bitmap b = callToServer(imageUrl);//takes long
                    return b;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap ret) {
                if (ret != null) {
                    photo.onImageLoaded(imageUri, ret);
                }
            }

        }.execute(imageUrl);

    }
private void loadImage(最终图像视图照片,最终字符串图像URL){
新建异步任务(){
@凌驾
受保护位图doInBackground(字符串…参数){
试一试{
位图b=callToServer(imageUrl);//需要很长时间
返回b;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onPostExecute(位图ret){
如果(ret!=null){
照片。onImageLoaded(imageUri,ret);
}
}
}.execute(imageUrl);
}
然后使用适配器调用loadRemoteImage(imageUri)


我还建议您将其与位图缓存相结合,以加速获取图像和添加占位符的过程:)

问题是行被回收,图像视图也被回收。然后,当服务器响应返回时,图像视图已经属于另一个数据对象

对此有不同的方法。我的解决方案是扩展ImageView并跟踪要加载的图像

class RemoteImageView extends ImageView {
   private String _uri;

   public synchronized void loadRemoteImage(String uri) {
       _uri = uri;
       loadImage(this, uri) ; //this is your async call
   }

  private synchronized void onImageLoaded(String uri, Bitmap image) {
       if(uri.equals(_uri)) {  //this will set only the correct image
            setImageBitmap(image);
       }
  } 

}
关于您的加载功能:

private void loadImage(final ImageView photo, final String imageUrl) {
        new AsyncTask<String, String, Bitmap>() {

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

                    Bitmap b = callToServer(imageUrl);//takes long
                    return b;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap ret) {
                if (ret != null) {
                    photo.onImageLoaded(imageUri, ret);
                }
            }

        }.execute(imageUrl);

    }
private void loadImage(最终图像视图照片,最终字符串图像URL){
新建异步任务(){
@凌驾
受保护位图doInBackground(字符串…参数){
试一试{
位图b=callToServer(imageUrl);//需要很长时间
返回b;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onPostExecute(位图ret){
如果(ret!=null){
照片。onImageLoaded(imageUri,ret);
}
}
}.execute(imageUrl);
}
然后使用适配器调用loadRemoteImage(imageUri)


我还建议您将其与位图缓存相结合,以加速获取图像和添加占位符的过程:)

您可以使用piccasso Library,因为问题是:我想了解该过程是如何工作的。我已经试过毕加索了。你可以用皮卡索图书馆,问题是:我想了解这个过程是如何运作的。但只是为了好玩:我已经试过毕加索了。我完全没有抓住解决这个问题的关键。我不知道这涉及到这么多,但在某些方面却很少。非常感谢您的完整回答。这不会解决问题