我刚刚遇到一个让我发疯的问题。 我有一个包含几个片段的viewpager(它们都是同一个类的实例),它们包含一个listview。每个listview行都有一个视图,我以异步方式加载任务。任务完成后,它将位图设置为imageView。显示代码是没有意义的,因为我确信它是正确的。一开始我开始使用ListFragment来简化,一切正常。列表视图平滑滚动,并且当用户向下滚动时,对同一片段内的视图执行异步任务。 但后来我意识到我需要自定义listview,所以我创建了自己的布局并将其设置为ListFragment,因为android开发人员docs状态(使用listview的预定义id,因此ListFragment可以找到它)覆盖onCreateView()。这里有一个奇怪的事情:一切都很顺利但现在当用户滚动并且asynctasks完成并设置位图时,viewpager重新创建所选片段和相邻片段的整个视图,这导致更多的asynctask被执行并且循环每次都重复asynctask设置位图。当用户由于大量重绘和异步调用调用而滚动时,这会导致大量冻结。我还尝试使用listview创建自定义片段(不是从ListFragment继承),但它发生的情况相同,每次线程将位图设置为行时,viewpager都会重新创建不必要的视图。 有人可以解释一下,为什么当我使用ListFragment时这不会发生,而在其他情况下确实会发生这种情况?我该如何解决? 提前谢谢。
编辑:
我发现了这个问题。令人惊讶的是,它位于listview xml布局中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/white" >
</ListView>
</RelativeLayout>
如果我设置了listview属性android:layout_height="wrap_content"
而不是match_parent,那么它会重新创建相邻页面的视图,并且每次异步设置位图时它本身都是不必要的。现在的问题是我无法将高度设置为wrap_content,因此即使listview有一些项目,它被绘制到底部是丑陋的。有什么建议吗?
答案 0 :(得分:0)
好的,我终于在这篇文章中找到了答案Android: wrap_content is not working with ListView
永远不应该将wrap_content
与listView一起使用,否则getView()
将被多次调用。说真的,这应该在文档中解释,这让我浪费了很多时间。