Android ListView搜索结果中的图像

Android ListView搜索结果中的图像,android,listview,Android,Listview,我有一个ListActivity,它启动一个任务来点击web服务并在ListView中显示结果。每个结果都附加了一个图像ID 我编写了一个方法,该方法将获取屏幕上显示的行的图像ID(firstVisiblePosition()到lastVisiblePosition()),并启动一个任务来查询另一个web服务,以获取要为这些项目显示的图像。当列表的滚动状态变为滚动状态空闲时,我调用此方法。这使得用户可以滚动,在滚动停止之前,获取可见行的图像的任务不会执行,从而阻止用户查找屏幕外行的图像 我的问题

我有一个ListActivity,它启动一个任务来点击web服务并在ListView中显示结果。每个结果都附加了一个图像ID

我编写了一个方法,该方法将获取屏幕上显示的行的图像ID(firstVisiblePosition()到lastVisiblePosition()),并启动一个任务来查询另一个web服务,以获取要为这些项目显示的图像。当列表的滚动状态变为滚动状态空闲时,我调用此方法。这使得用户可以滚动,在滚动停止之前,获取可见行的图像的任务不会执行,从而阻止用户查找屏幕外行的图像

我的问题是,当结果最初显示在ListView中时,我找不到调用我的方法来查找要查询的图像ID的好方法。显然,在调用setAdapter之后立即调用这个方法是不起作用的(我猜是因为ListView的一些工作是异步进行的)。我正在使用多个适配器(由于与本文无关的原因),因此在调用方法获取ID之前,我需要一种等待列表项显示的好方法


有什么想法吗?

在设置适配器或在适配器上调用
notifyDatasetChanged()
后,将“加载图像”代码作为可运行代码添加到列表的post队列中:

list.post( new Runnable() {
    @Override
    public void run() {
    //do stuff
    }
  });

如果我正确理解你的问题,那么你在通过网络加载图像和性能方面遇到了问题;如果是,

我将在适配器中创建一个简单的图像缓存,例如本地但全局的哈希映射:

private HashMap<String, Drawable> imgCache = new HashMap<String, Drawable>(); 私有HashMap<String,Drawable> imgCache=newhashmap<String,Drawable>(); 然后,在我的getView()方法中,我将异步(使用线程和处理程序)加载图像,并通过将位置指定为键,将加载的图像指定为可绘图项,将加载的图像保存在imgCache中

final Handler h = new Handler() { public void handleMessage(Message msg) { if(msg.obj != null) { Drawable drawable = (Drawable)msg.obj; image.setImageDrawable(drawable); image.postInvalidate(); image.requestLayout(); imgCache.put(cacheKey, drawable); } } }; loadImage(myImageView, imageURL, h); // threaded method which loads the images from net 最终处理程序h=新处理程序(){ 公共无效handleMessage(消息消息消息){ 如果(msg.obj!=null){ Drawable Drawable=(Drawable)msg.obj; image.setImageDrawable(可绘制); image.postInvalidate(); requestLayout(); imgCache.put(缓存键,可绘制); } } }; loadImage(myImageView,imageURL,h);//从网络加载图像的线程方法 另外,在我的getView()方法中,在调用loadImage之前,我会首先要求imgCache查看映像是否已经存在

这将优化您的列表并使您避免使用多个适配器等

希望这有帮助


-塞尔坎

这一切我都做过了。问题是,如果从上到下滚动,使用getView()将加载列表中的所有图像。这是浪费时间和记忆。它应该只尝试寻找用户可以看到的图像。因此,我将代码从getView移到了onScrollChanged。如果您感兴趣,我做了与您现在做的相同的事情,并且我发现
滚动\u STATE\u IDLE
没有我希望的那么精确,所以我实现了一些更高级的功能。我以前把这个作为一个答案贴了出来。