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

使用 ViewPager 滑动时,片段没有调用 OnResume()

Viewpager内滚动视图