ListView嵌套在API <21上滚动

nat*_*rio 8 android android-listview android-support-library android-design-library android-appbarlayout

标题很清楚.我有这个布局:

_________________
|_______________| <- Toolbar    
|___|___|___|___| <- Tablayout
|               |
|               |
|   ViewPager   |
|               |
|_______________|
Run Code Online (Sandbox Code Playgroud)

工具栏和tablayout都在一个内部AppBarLayout,所以我可以使用滚动标记来隐藏工具栏向上滚动.问题是这只适用于嵌套滚动支持的视图.大多数标签 - 我的意思是,大多数页面 - 是support.v4.NestedScrollViews,所以这是可以的; 其他人(并且需要)ListView.

从Lollipop开始,我可以简单地添加android:nestedScrollingEnabled="true"到列表视图,并且工具栏在滚动时正确隐藏.

但是,在API <21上,没有这样的属性,工具栏也不会隐藏.更重要的是,列表中的最后一项是隐藏的,因为有一些测量错误CoordinatorLayout:listview就好像它有工具栏当前占用的空间一样.

解决方案:

  • 切换到RecyclerView,它支持嵌套滚动:我不能,因为我需要使用只适用于适配器视图的外部库适配器,并且我无法替换(即,ParseQueryAdapter);

  • 扩展ListView和实现嵌套滚动:似乎很复杂;

  • 扩展ListView并实现一些解决方法,例如测量东西以避免最后一项问题或(和)自定义行为以使工具栏隐藏:似乎也很复杂;

  • 使用一些布局技巧:找不到.

有帮助吗?

例如,我(拼命)尝试:

<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>
Run Code Online (Sandbox Code Playgroud)

但是这种方式ListView并没有被列为match_parent.我得到一个小高度的小视图,页面的其余部分是空的.

ian*_*ake 2

不幸的是,没有办法让嵌套滚动正常工作ListView- 否则不需要像 API 21 中那样进行修改。

您会注意到当前的Parse SDK实际上已完全删除ParseQueryAdapter鉴于此,直接使用 Parse 查询 APIRecyclerView开始构建您自己的适配器可能是有意义的。

  • @Dogcat - 在 API 21 之前不执行任何操作。它只是让您不必检查 API 级别。 (2认同)
  • @Dogcat - [API 21 之前的源代码](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/compat/java/android/support/v4/view/ViewCompat .java#965) 要求视图实现支持库的 `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”确实实现了该框架。 (2认同)