Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.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 为什么我的listView仅设置为默认图像?_Java_Android_Listview_Caching_Android Listview - Fatal编程技术网

Java 为什么我的listView仅设置为默认图像?

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

我有一个android listView,我用图像填充它

我通过静默分页从服务器加载列表

我使用异步下载任务下载图像,并使用缓存层保存它们

每当我的适配器执行getView时,它都会将图像标记设置为其url

然后,在将drawable加载到图像视图之前,通过将下载的url与保留在标记中的url进行比较,检查它是否仍然相关(因为它是异步任务,滚动可能已经移动,此时项目已经被回收)

但是我通常只看到默认图像

我的逻辑中缺少了什么

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,正如上面在注释中提到的。它起作用了!谢谢但是现在加载速度真的很慢。我是否应该提出一个关于如何提高加载时间的新问题?酷!!。由于位图大小较大,加载速度可能较慢。现在尝试改进用户代码以提高性能。