android - 行变大后 ListView 不会调整大小从异步任务加载图像

标签 android android-asynctask imageview android-listfragment

我有一个 ListView 位于 TabHost 中。有一个自定义的 CursorAdapter 可以将 4 个不同的 View 返回到列表中。 4 种类型之一是从 SD 或 Assets 文件夹中提取的图像。最初我从 CursorAdapter 本身加载图像,这会导致 UI 线程在加载每个图像时挂起,所以我将代码移到了 AsyncTask

除了返回非常短的项目列表的情况外,这一切都有效。发生这种情况时,ListView 在图像加载后不会重新调整大小,您只能滚动屏幕顶部的一小部分。

我不知道如何让 listView 重新布局。在 View 本身上调用 relayout 和 invalidate 不起作用。试图找到 View 的父级返回 null。默认的 ListFragment 布局已经将高度设置为“Match_Parent”。手动将 onCreateView 中的布局设置为所有高度都设置为“Match_Parent”的布局并不能解决问题。传入适配器本身以调用 notifyDataSetChanged() 只会导致循环并且不会重新调整 ListView 的大小。

令人沮丧的是,当我更改选项卡时, View 会在新选项卡被绘制到它上面之前正确闪烁。偶尔,当我旋转设备或在选项卡之间轻弹时,它会正确呈现,但大多数时候不会。

出于调试目的,我尝试向 onListItemClick 添加各种重新布局命令,发现调用 ListView.relayout() 有时可以解决问题,但通常不会。

左边是它如何使用 AsyncTask 加载,右边是它如何使用主线程加载器加载。内容在左侧,但您必须滚动,因为 ListView 的大小不正确。

我错过了什么?有没有办法让 ListView 或当前选项卡甚至整个屏幕重绘?

最佳答案

需要通知ListView自己重绘。这是昂贵的,你应该尽量避免它。随着滚动位置不断变化,它也可能导致用户感到沮丧。我建议尝试找到一个理想的 ImageView 大小并使用它来锁定行高/宽度,这样动态内容确实会导致这些问题。

http://developer.android.com/reference/android/widget/ArrayAdapter.html#notifyDataSetChanged()

arrayAdapter.notfityDataSetChanged();

应该这样做。

关于android - 行变大后 ListView 不会调整大小从异步任务加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15651653/

相关文章:

android - setImageResource 崩溃的应用程序

android - 在 Google Market 上发布一个应用程序的多个版本

java - 使用 ViewPager 将 RecyclerView 添加到 Tabs fragment

带有进度对话框取消的 Android AsyncTask

android - 如何在android中的 ImageView 中显示我的所有图像

android - 使用按钮在运行时调整 ImageView 的大小 - Android

android - 星系 s 上 opengles2 和 Gingerbread 的问题

android - 通过 Internet 调试 android 设备

Android 如何在 onDestroy() 后重新连接到 AsyncTask 并重新启动 onCreate()?

Android : Extract article main content. 如何仅提取内容img并删除图标img