ListView嵌套在API< 21上滚动

时间:2015-09-27 18:02:38

标签: android android-listview android-support-library android-design-library android-appbarlayout

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

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

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

从Lollipop开始,我只需将android:nestedScrollingEnabled="true"添加到列表视图中,工具栏就会在滚动时正确隐藏。

在API&lt; 21上,没有这样的属性,工具栏也无法隐藏。更重要的是,列表中的最后一项是隐藏的,因为CoordinatorLayout中存在一些测量错误:listview的行为就好像它有工具栏当前占用的空间一样。

解决方案:

  • 切换到RecyclerView,它支持嵌套滚动:我不能,因为我需要使用只适用于适配器视图的外部库适配器,而且我可以使用t replace(即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。我得到一个小高度的小视图,页面的其余部分是空的。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

针对特定var ids = [62519, 1, 2, 3, 2656, 82969, 36201, 82969, 78788, 82969, 97647, 82969, 53745, 54510, 60850, 82969, 29872, 51407, 29347, 105113]; var cnames = {}; for (var i = 0; i < ids.length; i++) { var nlid = ids[i]; console.log(nlid); // It should be != not !== according to my knowledge if (cnames[nlid] != undefined) { console.log('already present'); } else { console.log('not present'); getCname(nlid) function getCname(nlid) { sqlcon.query('select name from ss_newsletters where newsletterid=' + nlid + ' limit 1', function (err, rows, fields) { if (err) { console.error(err); } else { var x = rows[0].name; cnames[nlid] = x; } }); } } } 问题中的问题,

答案 2 :(得分:1)

我实际上是Xamarin开发者,所以我无法测试这是否适用于这种特殊情况,但我发现an answer which helped me in 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拦截它们。它很简单,一直有效。

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