2011-07-07 83 views
0

我有一个ListActivity,它启动一个任务来打一个Web服务并在一个ListView中显示结果。每个结果都附有图像ID。ListView中的图像搜索结果

我写了一个方法,它将屏幕上显示的行的图像ID(firstVisiblePosition()转换为lastVisiblePosition()),并启动一个任务来查询另一个Web服务以获取这些项目的图像。当列表的滚动状态变为SCROLL_STATE_IDLE时,我调用这个方法。这使得用户可以滚动,并且在滚动停止之前不会执行任务以获取可见行的图像,从而防止它查看离屏行的图像。

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

任何想法?

回答

1

你设置了适配器或称为notifyDatasetChanged()适配器上后,添加“加载图片”代码列表的张贴队列作为一个Runnable:

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

真棒。谢谢。 – Andrew

+0

如果您有兴趣,我现在就做同样的事情,并且我发现'SCROLL_STATE_IDLE'不像我想的那样精确,所以我实现了一些更有趣的事情。我以前发布这个答案[这里](http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview/6358818#6358818 )。 – dmon

0

如果我正确的理解你的问题,您无法通过网络和性能问题加载图片;如果是这样,

我会创造我的适配器一个简单的图像缓存如本地,但全球的HashMap:

 
private HashMap&ltString, Drawable> imgCache = new HashMap&ltString, Drawable>(); 

然后在我的getView()方法,我会以异步方式(使用一个线程和处理程序)加载图像,并通过将位置作为关键字并将加载的图像指定为Drawable,将加载的图像保存在我的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 

也是,在我getView()方法,我会先问imgCache,看看是否已经存在的图像的LoadImage被调用之前。

这应该优化您的列表,并使用多个适配器等

希望这有助于拯救你,

-serkan

+0

我已经完成了所有这些。问题是如果从顶部滚动到底部,使用getView()将加载列表的所有图像。这是浪费时间和记忆。它应该只尝试寻找用户可以看到的图像。所以,我将代码从getView移动到onScrollChanged。 – Andrew