滚动 ListView,某些图像非常滞后

2024-02-04

我看到下面的屏幕,其中包含一些图像(每个可见页面 6 个图像)。对我来说,上下滚动似乎很滞后。就像它再次渲染图像一样。向上滚动似乎比向下滚动更糟糕。

有人知道如何提高此类区域的性能以创建漂亮的平滑滚动吗?

Update:图像和文本都是从我的 SQLite 数据库中检索的。该列表是使用 SimpleCursorAdapter 创建的。

private class HistoryViewBinder implements SimpleCursorAdapter.ViewBinder 
{
    //private int wallpaperNumberIndex;
    private int timeIndex;
    private int categoryIndex;
    private int imageIndex;

    private java.text.DateFormat dateFormat;
    private java.text.DateFormat timeFormat;
    private Date d = new Date();

    public HistoryViewBinder(Context context, Cursor cursor) 
    {
        dateFormat = android.text.format.DateFormat.getDateFormat(context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(context);

        //wallpaperNumberIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_WALLPAPER_NUMBER);
        timeIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_TIME);
        categoryIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_CATEGORY);
        imageIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_IMAGE);
    }

    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) 
    {
        Log.d(TAG, "setViewValue");

        if (view instanceof TextView)
        {
            Log.d(TAG, "TextView");
            TextView tv = (TextView) view;

            if (columnIndex == timeIndex)
            {
                Log.d(TAG, "timeIndex");
                d.setTime(cursor.getLong(columnIndex));
                tv.setText(timeFormat.format(d) + "  " + dateFormat.format(d));
                return true;
            }
            else if (columnIndex == categoryIndex)
            {
                Log.d(TAG, "categoryIndex");
                tv.setText(cursor.getString(columnIndex));
                return true;
            }
        }
        else if (view instanceof ImageView)
        {
            Log.d(TAG, "ImageView");
            ImageView iv = (ImageView) view;

            if (columnIndex == imageIndex)
            {
                Log.d(TAG, "imageIndex");
                byte[] image = cursor.getBlob(columnIndex);
                Bitmap bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length);
                iv.setImageBitmap(bitmapImage);
                return true;
            }
        }

        return false;
    }
}

问题是每个图像在视图准备显示时就被解码。 ListView 将回收您的视图,这意味着视图离开屏幕时它将被重用,因此图像将被覆盖并被垃圾收集。如果该项目重新进入屏幕,则必须再次从数据库中对图像进行解码。

解码速度相当快,但如果用户非常快地更改列表中的位置,所有解码调用都会使您的列表非常滞后。

我会实现类似图像缓存的东西。一个持有 Map 的类弱引用 http://developer.android.com/reference/java/lang/ref/WeakReference.html到图像。每次您想要显示图像时,您都会查看该图像是否已在地图中准备好,以及 WeakReference 是否仍然指向一个对象,如果不是这种情况,您需要解码图像,然后将其存储在地图中。

看一下延迟加载问题,这些问题将向您展示如何将解码置于后台任务中,然后在加载图像时更新列表。虽然需要付出更多的努力,但可以使列表变得更快。如果您要使用延迟加载问题中的代码示例,请尝试使用异步任务 http://developer.android.com/reference/android/os/AsyncTask.html而不是线程来进行解码。

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

滚动 ListView,某些图像非常滞后 的相关文章

随机推荐

  • Android获取外部存储绝对路径

    我想下载一些文件并将它们保存到手机 平板电脑的内部存储中 已在 Samsung Galaxy Note 2 和 Galaxt Tab 10 1 上试用 当我使用 storage sdcard0 在他们身上 代码运行成功 但是当我使用Gala
  • Require.js 忽略 baseUrl

    好吧 这让我发疯 所以也许有人可以指出我正确的方向 我使用最新的 require js 和 jquery 作为我的模块加载器 我正在使用data main属性指向一个配置文件baseUrl 当我尝试加载模块时baseUrl被忽略 并且 re
  • Flash:距 MovieClip 最近的点

    我需要限制一个点内DisplayObject艺术家给我的 我让它工作 但仅适用于光标仍在内部的情况bounds 有限对象称为limited function onSqMouseMove event MouseEvent if bounds
  • 在画布中移动按钮

    当鼠标悬停在 UIElement 上并且用户按下 Ctrl 键时 以下代码应该在画布中移动 UIElement void keydown Object sender KeyEventArgs e if e Key Key LeftCtrl
  • 如何运行本地 Windows 应用程序并将输出通过管道传输到浏览器

    我有 Windows 应用程序 EXE 文件是用 C 编写并使用 MS Visual Studio 构建的 它将 ASCII 文本输出到标准输出 我希望增强 ASCII 文本以包含有限的 HTML 和一些链接 我想调用此应用程序 EXE 文
  • 将向量列表转换为计数数据帧[重复]

    这个问题在这里已经有答案了 我有一个存储在如下列表中的字符向量列表 basket1 lt c Apple Orange Banana Apple Apple Grape basket2 lt c Grape Grape Grape Grap
  • 如何获取适配器内的视图高度以创建大小的位图?

    我将自定义 CursorAdapter 与自定义项一起使用 我需要视图高度来调整资源文件夹中位图的大小 并将此调整大小的位图设置为列表项中的 ImegeView Override public void bindView View view
  • 在 Firefox 中检测缩放

    我想检测浏览器是否放大或缩小 并不真正关心知道该值 但我认为无论如何都需要在决策过程中找到它 我已经阅读了很多关于该主题的其他 SO 帖子 但是没有一个给出的解决方案适用于 FF 尽管有 IE7 8 和 chrome 解决方案 哦 我不能使
  • 如何强制在派生类中调用基类构造函数?

    我相当确定基本的 C 问题 如果我有一个带有不带参数的构造函数的基类 并且只初始化一些受保护的成员 如果派生类与参数匹配 它是否也会立即调用此基构造函数 一厢情愿但不太可能的想法 如果不是 则为有没有办法强制它从派生类自动调用所述基构造函数
  • 数据绑定:如果属性不为空,则设置属性

    无法理解 仅当变量字段不为空时如何设置视图的某些属性 例如
  • 检查 python 类属性

    我需要一种方法来检查类 以便我可以安全地识别哪些属性是用户定义的类属性 问题是 dir inspect getmembers 等函数返回所有类属性 包括预定义的属性 例如 class doc dict hash 这当然是可以理解的 有人可能
  • 使用 VSTS 设置发布到文件夹

    我正在使用publish to folder通过右键单击项目 gt 发布 gt 发布到文件夹 通过 Visual Studio 选项 结果始终是已应用转换的可复制项目 我想使用 VSTS 自动化此过程并在 VSTS 上进行设置 我使用了后续
  • 如何在TreeView中显示目录? [复制]

    这个问题在这里已经有答案了 下面是我的代码 DirectoryInfo directoryInfo new DirectoryInfo C Users Shahul Documents Visual Studio 2010 Projects
  • sql if 在插入语句中没有选择

    昨天我问了这个问题 if在mysql中插入语句 https stackoverflow com questions 14960022 if in mysql insert statement答案非常有效 问题是 如果值不存在 我需要在表中插
  • 如何将字符串连接到现有文件?

    我有一个文本文件 其中有内容 我想向其中附加文本 这是我的代码 File outputFile new File hello out outputFile createSync List
  • 使用具有不同根和节点类型的 TreeTable

    我有以下问题 我想要一个类似 JTeeTable 的表组件 只不过树的根 下面的类 和节点不是同一类型 例如 假设我有以下课程 public final class Entry private int id private String t
  • 从哪里可以获得 x509 证书?

    我目前正在尝试创建基于 SslStream 类的聊天 我正在浏览该 msdn 链接 点击这里 http msdn microsoft com en us library system net security sslstream aspx
  • Visual Studio 2013 功能带有 NUnit 的 Code Lens

    在新的 Visual Studio 2013 中 有一个很好的新功能 称为代码镜头 http channel9 msdn com Series Visual Studio 2012 Premium and Ultimate Overview
  • 在 Python 中创建多个 CSV 工作表

    有没有办法在 Python 中以编程方式创建具有多个工作表的 CSV 文件 多个 CSV 文件 每张纸一个 CSV 文件 逗号分隔值文件是纯文本格式 它只能表示平面数据 例如表格 或 工作表 要存储多个工作表 您应该使用单独的 CSV 文件
  • 滚动 ListView,某些图像非常滞后

    我看到下面的屏幕 其中包含一些图像 每个可见页面 6 个图像 对我来说 上下滚动似乎很滞后 就像它再次渲染图像一样 向上滚动似乎比向下滚动更糟糕 有人知道如何提高此类区域的性能以创建漂亮的平滑滚动吗 Update 图像和文本都是从我的 SQ