Android - 将图像延迟加载到 ListView 中的问题

2023-11-26

这是一个非常常见的场景:在 ListView 中显示必须从互联网下载的图像。

现在我有一个 ArrayAdapter 的自定义子类,用于 ListView。在 ArrayAdapter 的 getView() 实现中,我生成一个单独的线程来加载图像。加载完成后,它会查找适当的 ImageView 并使用 ImageView.setImageDrawable() 设置图像。所以我使用的解决方案与此类似:ListView 中图像的延迟加载

我遇到的问题是,一旦我在 ImageView 上调用 setImageDrawable() ,ListView 就会以某种方式刷新列表中当前所有可见的行!这会导致无限循环:

  1. getView() 被调用
  2. 产生线程来加载图像
  3. 图像已加载;在 ImageView 上调用 setImageDrawable()
  4. ListView 由于某种原因拾取它并自行刷新
  5. 为了刷新 ListView,为每个可见行调用 getView(),因此我们返回到步骤 1,整个过程会重复进行

据我所知,“Android - 如何在 ListView 中延迟加载图像”(请参阅​​上面的链接)中提出的解决方案根本不起作用。它可能看起来像这样,但它运行速度非常慢,因为在后台,它不断重新加载当前可见的行。

有人以前遇到过这个问题和/或有解决方案吗?


我使用了以下链接中的代码:另一个 stackoverflow 问题

为了解决回收视图问题,我做了一些小改动。我将图像的 url 设置为适配器中 imageview 的标签。以下代码包含我解决回收问题的解决方案:

public void fetchDrawableOnThread(final String urlString, final ImageView imageView,Drawable drw) {

    imageView.setImageDrawable(drw);//drw is default image
    if (drawableMap.containsKey(urlString)) {
        if(imageView.getTag().toString().equals(urlString))
        {
            imageView.setImageBitmap(drawableMap.get(urlString));
            imageView.invalidate();
            return;
        }

    }

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            BitmapWrapper wrapper = (BitmapWrapper)message.obj;
            if(wrapper.imageurl.equals(imageView.getTag().toString()))
            {
                imageView.setImageBitmap((Bitmap)wrapper.bitmap);
                imageView.invalidate();
            }

        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            //TODO : set imageView to a "pending" image

            Bitmap drawable = fetchDrawable(urlString);
            BitmapWrapper wrapper = new BitmapWrapper();
            wrapper.bitmap = drawable;
            wrapper.imageurl = urlString;
            Message message = handler.obtainMessage(1, wrapper);
            handler.sendMessage(message);
        }
    };
    thread.start();
}


    public class BitmapWrapper
{
    public Bitmap bitmap;
    public String imageurl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 将图像延迟加载到 ListView 中的问题 的相关文章

随机推荐

  • 如何从 ast.FunctionDef 节点创建函数对象?

    我试图了解 python 代码的执行过程 假设源有一个函数定义 使用ast parse 我将其解析为一个 ast 其中将包含一个实例FunctionDef节点类 该节点实例不是可调用的 并且与函数对象不同 如何从这个 ast 创建函数对象及
  • Linq 异常:只能从 linq to 实体调用函数

    我有一个StudentReceipts存储的表ReceiptNo as string 001 002 003 099 我想要获取最后一张收据的详细信息 以便增加下一笔交易的收据编号 这是我尝试过的 var lastGeneratedRecD
  • 将html表导出到Excel javascript函数特殊字符已更改

    我有以下将 html 导出到 Excel 的函数 function generateexcel tableid var table document getElementById tableid var html table outerHT
  • 删除 Github 中的自定义域

    我想从 Github 中删除自定义域 请提供任何帮助 其实我想得到https myaseen208 github io DialelAnalysisR 而不是http www myaseen208 com DialelAnalysisR 如
  • 亿级记录批量插入

    将 2 37 亿条记录插入具有规则 用于跨子表分配数据 的表中的最快方法是什么 我曾经尝试过或考虑过 插入语句 事务性插入 BEGIN and COMMIT The COPY FROM命令 http pgbulkload projects
  • HTML5 CANVAS 绘制图像

    这是我的问题 我有点不明白下面函数中的 sx 和 sy 是什么意思 context drawImage 图像 sx sy sw sh dx dy dw dh 我真正的意思是 如果我们改变 sx 和 sy 的值 并将 dx 和 dy 设置为固
  • 从 HttpServletRequest 对象获取发布的 XML

    我有一个接收 HttpServletRequest 的过滤器 该请求是一个 POST 其中包含一个我需要读入过滤器方法的 xml 从 HttpServletRequest 对象获取发布的 xml 的最佳方法是什么 这取决于客户如何发送它 如
  • 尽管元组是不可变的,但它们在交互模式下存储在不同的地址中。为什么?

    t 1 2 3 t1 1 2 3 print id t print id t1 上面几行代码在Python中的脚本模式下给出了相同的地址 但在交互模式下它输出了不同的地址 谁能解释一下原因吗 当编译脚本时 编译器可以搜索所有等效的元组并生成
  • Vue.js 如何在 v-for 循环中使用单选按钮

    我正在尝试使用单选按钮 以便用户可以选择其中一张照片作为他们的个人资料照片 ul li div div div photo id p imgId div div div li ul
  • 如何在 R 中同时按两列对行进行排序?

    以下是根据 v2 列进行排名的代码 x lt data frame v1 c 2 1 1 2 v2 c 1 1 3 2 x rank1 lt rank x v2 ties method first 但我真的想根据 v2 和 然后 v1 进行
  • SQL 中的分层标记

    我有一个 PHP Web 应用程序 它使用 MySQL 数据库进行对象标记 其中我使用了被接受为答案的标记结构这个问题 我想实现一个标签层次结构 其中每个标签都可以有一个唯一的父标签 然后 搜索父标签 T 将匹配 T 的所有后代 即 T 父
  • Roslyn 分析器规则不会使构建失败

    继从this来自 MS 的教程 我为 Roslyn 创建了一个分析器 根据页面 您可以将规则标记为DiagnosticSeverity Error 这将导致构建中断 在声明规则字段的行中 您还可以将要生成的诊断的严重性更新为错误而不是警告
  • 如何从pom.xml获取属性值?

    我在 pom xml 中添加了一个节点
  • 将 2D javascript 数组导出到 Excel 工作表

    我知道 这里有数百个关于这个主题的问题 但经过一天的搜索 我仍然找不到满意的答案 我有一个 2D javascript 数组 我想将其下载为 Excel 工作表 这是我迄今为止得到的代码的一个小提琴 https jsfiddle net 3
  • ThreeJS 3D 对象的 2D 边界框

    我需要找出我的 3D 对象使用的屏幕区域 我尝试用谷歌搜索答案 但没有成功 功能geometry computeBoundingBox 仅返回 3D 边界框 我怎样才能将其转换为二维边界框 您只需将所有顶点转换为屏幕空间并根据它们创建 2D
  • SwiftUI 全屏 UIImagePickerController(相机)

    我提出一个UIImagePickerController在我的应用程序中 通过在 a 中呈现逻辑sheet修饰符 简而言之 以下三种类型处理显示和消除实例UIImagePickerController里面的一个UIViewControlle
  • Err.Raise() 忽略自定义描述和源

    我有一个带有 Let 函数的类模块 该函数会引发自定义错误 示例如下所示 Private pValue As Double Public Property Let Value v As Double If v lt 0 Then Err R
  • MySQL在group by中选择最大记录

    我正在尝试在包含约 500 000 条记录和约 50 或 60 列的表中创建一个查询 我需要的是将这些记录整理成组并选择每个组中的最大记录 为了简化问题我有一个表格如下 id external id group id mypath 1 10
  • 为什么vue更改特定数组成员而不更新dom

    我想知道为什么我更改了数组的特定项目而页面没有更新 我知道 vue js 的文档指出 由于 JavaScript 的限制 Vue 无法检测到数组的以下更改 当您直接使用索引设置项目时 例如vm items indexOfItem newVa
  • Android - 将图像延迟加载到 ListView 中的问题

    这是一个非常常见的场景 在 ListView 中显示必须从互联网下载的图像 现在我有一个 ArrayAdapter 的自定义子类 用于 ListView 在 ArrayAdapter 的 getView 实现中 我生成一个单独的线程来加载图