1

我有一个ListView在里面的TabHost。有一个习惯CursorAdapter将 4 个不同的视图返回到列表中。4 种类型之一是从 SD 或资产文件夹中提取的图像。最初我从CursorAdapter自身加载图像,这会导致 UI 线程在加载每个图像时挂起,因此我将代码移动到AsyncTask.

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

我无法弄清楚如何获得listView重新布局。在视图本身上调用重新布局和无效是不起作用的。尝试查找 View 的父级返回 null。默认的 ListFragment 布局已经将高度设置为“Match_Parent”。手动将 onCreateView 中的布局设置为所有高度都设置为“Match_Parent”的布局并不能修复它。传入适配器本身来调用notifyDataSetChanged()只会导致循环并且不会重新调整ListView.

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

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

左边是它如何通过 AsyncTask 加载,右边是它如何通过主线程加载器加载。内容在左侧,但您必须滚动,因为列表视图的大小不正确。

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

4

2 回答 2

1

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

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

arrayAdapter.notfityDataSetChanged();

那应该这样做。

于 2013-03-27T04:44:57.537 回答
0

问题是由于 ListView 布局后 ImageView 调整大小造成的。在关闭 AsyncTask 之前将 ImageView 的高度和宽度设置为图像的尺寸,使 ListView 布局正确。

我的图像都是本地的,文件名等在数据库中,因此我可以在加载图像之前获得正确的尺寸。如果您无法提前获得图像尺寸,我不能 100% 确定您会做什么。

于 2013-03-27T23:36:00.973 回答