API<21上的ListView嵌套滚动

8
标题很清晰。我现在有这样的布局:
_________________
|_______________| <- Toolbar    
|___|___|___|___| <- Tablayout
|               |
|               |
|   ViewPager   |
|               |
|_______________|

工具栏和选项卡布局都在AppBarLayout中,所以我可以使用滚动标志来隐藏向顶部滚动时的工具栏。问题在于,这仅适用于支持嵌套滚动的视图。大多数选项卡 - 我的意思是大多数页面 - 都是support.v4.NestedScrollView,所以没问题;其他一些是(并且需要)ListView。
从Lollipop开始,我只需将android:nestedScrollingEnabled =“true”添加到列表视图中,工具栏就会在滚动时正确隐藏。
但是,在API<21上,没有这样的属性,工具栏不会隐藏。更重要的是,列表中的最后几项被隐藏了,因为在CoordinatorLayout中存在一些测量错误:listview表现得好像它占用了工具栏当前占用的空间。
解决方案:
1. 切换到支持嵌套滚动的RecyclerView:不行,因为我需要使用一个外部库适配器,它只能与适配器视图一起使用,而我无法替换它(即ParseQueryAdapter);
2. 扩展ListView并实现嵌套滚动:似乎太复杂了;
3. 扩展ListView并实现一些解决方法,例如测量内容以避免最后一个项目的问题或(和)自定义行为以使工具栏隐藏:也似乎很复杂;
4. 使用一些布局技巧:没有找到。
有什么帮助吗?
例如,我(绝望地)尝试过:
<android.support.v4.widget.NestedScrollView
    android:nestedScrollingEnabled="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</android.support.v4.widget.NestedScrollView>

但是这种方式下,ListView 不会像 match_parent 一样布局。我只能得到一个高度较小的视图,而页面的其余部分为空白。

2个回答

2

我不在最新的版本上,但我记得那个类在公共API中没有列出很长时间了。不过还是谢谢你说“你不能” - 我花了几个小时来处理NestedScrolling接口。 - natario
没有办法在ListView上实现嵌套滚动。有ViewCompat.setNestedScrollingEnabled(ListView, boolean)方法可用。 - Dogcat
2
@Dogcat - 在API 21之前什么也不做。它只是让你免于检查API级别的麻烦。 - ianhanniballake
2
@Dogcat - pre-API 21源代码要求视图实现Support Library的'NestedScrollingChild' 接口,而像'ListView'这样的框架类永远不会这样做。只有在[API 21+] (https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/compat/api21/android/support/v4/view/ViewCompatLollipop.java#148)上,它才调用到框架的'setNestedScrollingEnabled',而'ListView'确实实现了它。 - ianhanniballake

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接