8

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

_________________
|_______________| <- Toolbar    
|___|___|___|___| <- Tablayout
|               |
|               |
|   ViewPager   |
|               |
|_______________|

工具栏和 tablayout 都在内部AppBarLayout,所以我可以使用滚动标志来隐藏工具栏滚动到顶部。问题是这只适用于支持嵌套滚动的视图。大多数标签——我的意思是,大部分页面——都是support.v4.NestedScrollViews,所以没关系;其他人是(并且需要)ListViews。

从 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>

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

4

3 回答 3

2

不幸的是,没有办法让嵌套滚动工作ListView- 否则它不需要在 API 21 中完成的修改。

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

于 2015-09-28T00:11:43.367 回答
1

对于那些对特定ParseQueryAdapter问题感兴趣的人,

于 2015-09-28T08:52:25.210 回答
1

我实际上是一名Xamarin开发人员,所以我无法测试这是否适用于这种特殊情况,但我找到 了一个帮助我的答案Xamarin,所以我要分享它:

我找到了一个效果很好并且可以毫无问题地滚动 ListView 的解决方案:

ListView lv = (ListView)findViewById(R.id.myListView);  // your
listview inside scrollview lv.setOnTouchListener(new
ListView.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            // Disallow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

        case MotionEvent.ACTION_UP:
            // Allow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
        }

        // Handle ListView touch events.
        v.onTouchEvent(event);
        return true;
    }
});

这样做是禁用 ScrollView 上的 TouchEvents 并使 ListView 拦截它们。它很简单,并且一直有效。

如果这不起作用,请告诉我,以便我可以删除此答案。但也许它对任何人都有帮助,因为我也发现了这个问题,而且似乎没有解决方案。

于 2018-06-15T11:40:37.280 回答