我有一个 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/