viewpager 内无法解释的 ListFragment 行为
Posted
技术标签:
【中文标题】viewpager 内无法解释的 ListFragment 行为【英文标题】:Unexplained ListFragment behaviour inside viewpager 【发布时间】:2015-07-08 01:43:36 【问题描述】:我刚刚遇到了一个让我很生气的问题。 我有一个带有几个片段(它们都是同一类的实例)的视图页面,其中包含一个列表视图。每个列表视图行都有一个视图,我将其异步加载到任务中。当任务完成时,它将位图设置到 imageView 中。显示代码没有意义,因为我确信它是正确的。一开始,为了简单起见,我开始使用 ListFragment,一切正常。当用户向下滚动时,列表视图平滑滚动,并为同一片段内的视图执行异步任务。 但后来我意识到我需要自定义列表视图,所以我创建了自己的布局并将其设置为 ListFragment,如 android 开发人员文档所述(使用列表视图的预定义 ID,以便 ListFragment 可以找到它)覆盖 onCreateView()。奇怪的事情来了:一切都很好,但是现在当用户滚动并且异步任务完成并设置位图时,viewpager 会重新创建所选片段和相邻片段的整个视图,这会导致执行更多异步任务并且循环每次都重复asynctask 设置位图。由于大量的重绘和异步任务调用,当用户滚动时,这会导致很多冻结。我还尝试使用列表视图创建自定义片段(不是从 ListFragment 继承),但它发生相同,每次线程将位图设置为一行时,viewpager 都会重新创建不必要的视图。 有人可以解释一下为什么当我使用 ListFragment 时不会发生这种情况,而在另一种情况下会发生这种情况?我该如何解决? 提前致谢。
编辑:我发现了问题。令人惊讶的是它在 listview xml 布局中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<ListView
android:id="@id/android:list"
android:layout_
android:layout_
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/white" >
</ListView>
</RelativeLayout>
如果我设置 listview 属性 android:layout_height="wrap_content"
而不是 match_parent,那么每次异步设置位图时它都会重新创建相邻页面的视图,并且它本身是不必要的。现在的问题是我无法将高度设置为 wrap_content,因此即使列表视图有一些项目,它也会被绘制到丑陋的底部。请问有什么建议吗?
【问题讨论】:
【参考方案1】:好的,我终于在这篇帖子Android: wrap_content is not working with ListView找到了答案
它不应该与 listView 一起使用wrap_content
,否则getView()
将被调用多次而不必要。说真的,这应该在文档中的某个地方进行解释,这让我浪费了很多时间。
【讨论】:
以上是关于viewpager 内无法解释的 ListFragment 行为的主要内容,如果未能解决你的问题,请参考以下文章
带有边距和页面转换器的片段内的 ViewPager 无法正确呈现
无法使用回收视图在 ScrollVIew/NestedScrollView 内滚动 ViewPager
ViewPager2嵌套RecyclerView滑动冲突解决办法
如何在viewPager的视图顶部使用nestedScrollView中的viewpager