2015-09-04 45 views
0

我有一个列表视图的图像。异步任务完成后更新列表视图Android

如果本地缓存中不存在图像,则占位符图像将保留在图像的位置。

然后运行一个异步任务从服务器下载图像。

异步任务完成后,我将imageView位图设置为下载的图像。 然后我打电话notifyDataSetChanged()

问题是我需要向下滚动并向上滚动以显示每个单元格以显示已下载的新图像。它不会自动更新单元格。

所以我必须:

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> { 

    private ImageView imageView; 

    public ImageLoadTask(ImageView imageView) { 
     this.imageView = imageView; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 

     // download image from server and return  
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     imageView.setImageBitmap(result) 
     notifyDataSetChanged() 
    } 
} 

在我getView()方法,我有:

if(image exists in cache){ 
    myImageView.setBitmap(image in Cache); 
}else{ 
    new ImageLoadTask(myImageView).execute() 
} 

这样被保存在缓存做工精细任何图像。

任何必须首先下载的图像都不会正确更新,除非您向下滚动并再次备份。

什么问题?

+0

我建议你使用凌空或毕加索图书馆来加载图像。 –

+0

你需要做以下 //清除现有项目 'listAdapter.clear();' //添加新项目 'listAdapter.addAll(updatedvalues);' //通知,该数据已经改变 ' listAdapter.notifyDataSetChanged();' –

回答

0

我相信你正在做thigs已经完成,工作很好。

我建议你使用库来加载带有listview的图像。其中之一是picasso Picasso Android库。这个库提供下载和缓存,并可以很容易地(一行)显示它们到imageview。它也为占位符图像提供了可能性。

Picasso.with(context) 
    .load(url) 
    .resize(50, 50) 
    .centerCrop() 
    .into(imageView) 

这里是stackoveflow另一个问题: Using Picasso library with ListView

编辑: 如果使用毕加索你也将与在滚动图片显示错误的问题解决。如果您正在使用AsyncTask加载/下载它们,并且没有正确执行,则会发生这种情况。

我回答问题有关此问题的几个daays前:Why are wrong images getting loaded in ListView occasionally?

+0

我喜欢这个图书馆......从来没有听说过它。我有一个名为'setRoundedCorners(位图,左,右,上,下)'的方法。我通常会通过这里运行位图。我将如何使用这种方法与毕加索? –

+0

你可以使用picasso [picasso](http://square.github.io/picasso/)的transform api来看看=) –

0

首先,如果您是直接使用ImageView的对象,那么你就需要调用notifyDataSetChanged。 其次,您需要确保的是,您传递的ImageView对象仍然存在于所请求的相同URL中,也就是说,您必须知道Android将重新使用视图,并且可能在您将滚动的ImageView对象您为URL所请求的内容将改为其他某个网址。

我在一个非常类似的场景中工作,在那里我有一个独立的设计,如Adapter - > ImageViewRequest(该类将用于发布请求,并且该类保持ImageView和URL的映射。因此,对于映射完成的每个请求条目,并且对于每个响应,我们检查URL的响应是当前请求的该ImageView条目的URL,然后进行相应设置) - > AsyncTask 同时还要确保在设置你可以在runOnUIThread任务中做到这一点,以确保图像正确加载,否则你可能会崩溃,说你设置在一个错误的线程。

希望可以帮到:)