从asynctask加载图像后,ListView不会调整大小

时间:2013-03-27 03:57:09

标签: android android-asynctask imageview android-listfragment

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

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

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

令人沮丧的是,当我更改标签时,视图会在新标签被拉过之前正确闪烁。偶尔当我旋转设备或在标签之间轻弹时它会正确渲染,但大部分时间都没有。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

arrayAdapter.notfityDataSetChanged();

应该这样做。

答案 1 :(得分:0)

问题是由ListView布局后ImageView调整大小引起的。在旋转AsyncTask之前将ImageView的高度和宽度设置为图像的尺寸会使ListView布局正确。

我的图像都是db中的文件名等本地图像所以我可以获得正确的尺寸加载图像。如果你不能提前得到图像尺寸,我不能100%肯定你会做什么。