我的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
或当前标签甚至整个屏幕重绘?
答案 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%肯定你会做什么。