【问题标题】:Images in ListView search resultsListView 搜索结果中的图像
【发布时间】:2011-07-07 19:36:23
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

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

    【讨论】:

    • 如果你有兴趣,我做了你现在正在做的同样的事情,我发现SCROLL_STATE_IDLE 没有我想要的那么精确,所以我实现了一些更奇特的东西。我之前将此作为答案发布here
    【解决方案2】:

    如果我没有正确理解您的问题,那么您在通过网络加载图像和性能问题时遇到了问题;如果是的话,

    我会在我的适配器中创建一个简单的图像缓存,例如一个本地但全局的 HashMap:

    private HashMap imgCache = new HashMap();

    然后在我的 getView() 方法中,我将异步(使用线程和处理程序)加载图像并将加载的图像保存在我的 imgCache 中,方法是将位置分配为键并将加载的图像作为 Drawables。

    最终处理程序 h = new Handler() { 公共无效句柄消息(消息消息){ 如果(msg.obj != null){ 可绘制的drawable = (Drawable)msg.obj; image.setImageDrawable(drawable); image.postInvalidate(); image.requestLayout(); imgCache.put(cacheKey, drawable); } } }; loadImage(myImageView, imageURL, h); // 从网络加载图像的线程方法

    另外,在我的 getView() 方法中,我会先询问 imgCache 在调用 loadImage 之前查看图像是否已经存在。

    这应该会优化您的列表并让您免于使用多个适配器等。

    希望这会有所帮助,

    -serkan

    【讨论】:

    • 我已经完成了所有这些。问题是如果您从顶部滚动到底部,使用 getView() 将加载列表的所有图像。这是浪费时间和记忆。它应该只尝试寻找用户可以看到的图像。所以,我将代码从 getView 移到了 onScrollChanged。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多