Java 为什么我的listView仅设置为默认图像?
我有一个android listView,我用图像填充它 我通过静默分页从服务器加载列表 我使用异步下载任务下载图像,并使用缓存层保存它们 每当我的适配器执行getView时,它都会将图像标记设置为其url 然后,在将drawable加载到图像视图之前,通过将下载的url与保留在标记中的url进行比较,检查它是否仍然相关(因为它是异步任务,滚动可能已经移动,此时项目已经被回收) 但是我通常只看到默认图像 我的逻辑中缺少了什么Java 为什么我的listView仅设置为默认图像?,java,android,listview,caching,android-listview,Java,Android,Listview,Caching,Android Listview,我有一个android listView,我用图像填充它 我通过静默分页从服务器加载列表 我使用异步下载任务下载图像,并使用缓存层保存它们 每当我的适配器执行getView时,它都会将图像标记设置为其url 然后,在将drawable加载到图像视图之前,通过将下载的url与保留在标记中的url进行比较,检查它是否仍然相关(因为它是异步任务,滚动可能已经移动,此时项目已经被回收) 但是我通常只看到默认图像 我的逻辑中缺少了什么 private final LruCache<String, B
private final LruCache<String, Bitmap> imageCache = new LruCache<String, Bitmap>(
100);
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (position != 0
&& (PublicMacros.OFFERS_PAGE_SIZE / 2 == position)
&& ((position / PublicMacros.OFFERS_PAGE_SIZE + 1)
* PublicMacros.OFFERS_PAGE_SIZE + 1) > mOffersList
.size() && lastTriggeringPosition != position)
// ask next page
// maybe add loader
{
lastTriggeringPosition = position;
mOffersListActivity.getOffersFromServer(++pageNumber,
PublicMacros.OFFERS_PAGE_SIZE);
}
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mOffersListActivity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.offer_list_item, null);
} else {
// fetch existing data
}
initLayout(position, convertView);
setChangeableViews(convertView);
return convertView;
}
//called in setChangeableViews
private void setItemBgImage(View convertView) {
String imageUrl = getImageUrlFromOffer(convertView);
Bitmap bitmap = imageCache.get(imageUrl);
// anyhow set to default image
Drawable dr = mOffersListActivity.getResources().getDrawable(
R.drawable.lock_closed);
ImageView offerImage = ((ImageView) convertView
.findViewById(R.id.offerImage));
if (bitmap != null) {
dr = new BitmapDrawable(
// bitmap compression code
mOffersListActivity.getResources(), bitmap);
} else {
// check if already in the process of downloading
if (!downloadingImageUrls.contains(imageUrl)) {
downloadingImageUrls.add(imageUrl);
new DownloadImageAsyncTask2(offerImage).execute(imageUrl);
}
}
offerImage.setImageDrawable(dr);
offerImage.setTag(imageUrl);
}
public class DownloadImageAsyncTask2 extends
AsyncTask<String, Void, Bitmap> {
private final ImageView imageView;
private String imageUrl;
public DownloadImageAsyncTask2(ImageView imageView) {
this.imageView = imageView;
}
@Override
protected void onPreExecute() {
Log.i("DownloadImageAsyncTask", "Starting image download task...");
}
@Override
protected Bitmap doInBackground(String... params) {
imageUrl = params[0];
try {
return BitmapFactory.decodeStream((InputStream) new URL(
imageUrl).getContent());
} catch (IOException e) {
Log.e("DownloadImageAsyncTask", "Error reading bitmap" + e);
downloadingImageUrls.remove(imageUrl);
}
return null;
}
}
private final LruCache imageCache=新LruCache(
100);
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
如果(位置)=0
&&(PublicMacros.OFFERS_页面_大小/2==位置)
&&((position/PublicMacros.OFFERS_PAGE_SIZE+1)
*PublicMacros.OFFERS_PAGE_SIZE+1)>mOffersList
.size()&&lastTriggeringPosition!=位置)
//问下一页
//也许可以添加加载器
{
lastTriggeringPosition=位置;
mofferslistativity.getOfferFromServer(++pageNumber,
PublicMacros.提供页面大小);
}
if(convertView==null){
LayoutInflater充气机=(LayoutInflater)MOFFERSLISSTActivity
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.offer\u list\u项,空);
}否则{
//获取现有数据
}
初始布局(位置、视图);
SetChangeableView(convertView);
返回视图;
}
//在SetChangeableView中调用
私有void setItemBgImage(视图转换视图){
字符串imageUrl=getImageUrlFromOffer(convertView);
位图位图=imageCache.get(imageUrl);
//无论如何设置为默认图像
Drawable dr=moffersListativity.getResources().getDrawable(
R.可拉拔。锁(U关闭);
ImageView offerImage=((ImageView)convertView
.findviewbyd(R.id.offerImage));
if(位图!=null){
dr=新的位图可绘制(
//位图压缩代码
mofferslistativity.getResources(),位图);
}否则{
//检查是否已在下载过程中
如果(!downloadingImageUrls.contains(imageUrl)){
下载imageUrl.add(imageUrl);
新下载的ImageAsyncTask2(offerImage).execute(imageUrl);
}
}
提供初始值。可设置图像绘制(dr);
setTag(imageUrl);
}
公共类下载ImageAsyncTask2扩展
异步任务{
私人最终影像视图;
私有字符串imageUrl;
公开下载ImageAsyncTask2(ImageView ImageView){
this.imageView=imageView;
}
@凌驾
受保护的void onPreExecute(){
Log.i(“DownloadImageAsyncTask”,“启动图像下载任务…”);
}
@凌驾
受保护位图doInBackground(字符串…参数){
imageUrl=params[0];
试一试{
返回BitmapFactory.decodeStream((InputStream)新URL(
getContent());
}捕获(IOE异常){
Log.e(“下载ImageAsyncTask”,“读取位图时出错”+e);
下载imageUrl.remove(imageUrl);
}
返回null;
}
}
您可以参考此库
它是一个用于在Android上加载、缓存和显示图像的库
您的代码看起来不完整。请指定imageCache,我假设它是imageurl和位图的hashmap。您应该将位图的值放入onPostExecute()中的imageCache hashmap,并且可能会从下载列表中删除。谢谢,我已经添加了
imageCache
覆盖onPostExecute,正如上面在注释中提到的。它起作用了!谢谢但是现在加载速度真的很慢。我是否应该提出一个关于如何提高加载时间的新问题?酷!!。由于位图大小较大,加载速度可能较慢。现在尝试改进用户代码以提高性能。