Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView没有';从asynctask加载图像时,行变大后无法调整大小_Android_Android Asynctask_Imageview_Android Listfragment - Fatal编程技术网

Android ListView没有';从asynctask加载图像时,行变大后无法调整大小

Android ListView没有';从asynctask加载图像时,行变大后无法调整大小,android,android-asynctask,imageview,android-listfragment,Android,Android Asynctask,Imageview,Android Listfragment,我有一个列表视图,它位于选项卡主机中。有一个自定义的CursorAdapter将4个不同的视图返回到列表中。这四种类型中的一种是从SD或assets文件夹中提取的图像。最初,我让图像从游标适配器本身加载,这会导致UI线程在加载每个图像时挂起,因此我将代码移动到异步任务中 除了返回非常短的项目列表的情况外,这一切都有效。当这种情况发生时,ListView在图像加载后不会重新调整大小,您只能在屏幕顶部的一小部分滚动 我不知道如何让列表视图重新显示。对视图本身调用relayat和invalidate不

我有一个
列表视图
,它位于
选项卡主机
中。有一个自定义的
CursorAdapter
将4个不同的视图返回到列表中。这四种类型中的一种是从SD或assets文件夹中提取的图像。最初,我让图像从
游标适配器本身加载,这会导致UI线程在加载每个图像时挂起,因此我将代码移动到
异步任务中

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

我不知道如何让
列表视图
重新显示。对视图本身调用relayat和invalidate不起作用。尝试查找视图的父级将返回null。默认的ListFragment布局已将高度设置为“匹配父项”。手动将onCreateView中的布局设置为所有高度都设置为“匹配父级”的布局并不能解决此问题。传入适配器本身以调用
notifyDataSetChanged()
只会导致循环,而不会重新调整
列表视图的大小

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

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

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


我错过了什么?有没有办法让列表视图、当前选项卡甚至整个屏幕重新绘制?

您需要通知列表视图重新绘制自己。这很昂贵,你应该尽量避免。当滚动位置不断变化时,这也可能会让用户感到沮丧。我建议尝试找到理想的ImageView大小,并使用它锁定行高/行宽,以便动态内容不会导致这些问题


应该可以了。

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


这应该可以解决问题。

问题是由列表视图布局后ImageView的大小调整引起的。在旋转异步任务之前,将ImageView的高度和宽度设置为图像的尺寸,可以使ListView布局正确。

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

这个问题是由于在布局ListView之后ImageView的大小调整引起的。在旋转异步任务之前,将ImageView的高度和宽度设置为图像的尺寸,可以使ListView布局正确。

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

调用arrayAdapter.notifyDataSetChanged();没有解决问题。它只是产生了一个无限循环。你从哪里调用它的?我相信您希望从asynctask的onPostExecute方法调用它。这正是我调用它的地方。这会使列表刷新,并重新生成所有视图,因此它会再次调用自身,因此列表会刷新所有项,因此它会再次调用异步,从而重新生成列表等。它不会修复ListView本身大小错误的事实。我会放一些图片。啊,是的,你需要重新使用你的视图。检查ViewHolder模式。您还需要将下载的图像保存在lrucache中。有相当多的文章详细介绍了整个过程,这比您最初问题的范围要大一些。我已经在使用视图持有者和重用视图了。看看我刚才添加到问题中的图像,看看问题出在哪里;没有解决问题。它只是产生了一个无限循环。你从哪里调用它的?我相信您希望从asynctask的onPostExecute方法调用它。这正是我调用它的地方。这会使列表刷新,并重新生成所有视图,因此它会再次调用自身,因此列表会刷新所有项,因此它会再次调用异步,从而重新生成列表等。它不会修复ListView本身大小错误的事实。我会放一些图片。啊,是的,你需要重新使用你的视图。检查ViewHolder模式。您还需要将下载的图像保存在lrucache中。有相当多的文章详细介绍了整个过程,这比您最初问题的范围要大一些。我已经在使用视图持有者和重用视图了。看看我刚才添加到问题中的图像,看看问题出在哪里。我发现了类似的问题,但是在项目视图没有正确布局的地方,它使用了RelativeLayout。将图像下方的控件和图像本身以线性方式分组解决了问题,无需预先查询图像大小(SDK为14)。谢谢。ImageView目前是RelativeLayout的一部分。我真的不喜欢它最后的表现方式,所以当我再次访问它时,我可能会将它更改为线性布局。摆脱它会很好
arrayAdapter.notfityDataSetChanged();