无缝嵌套滚动(Android)

时间:2014-11-27 02:57:40

标签: android listview

我们都被建议不要嵌套包含滚动机制的视图。但是,在最新的Android版本(5.0)中,Phone应用程序引起了我的注意,ListView内部似乎是ScrollView

真正引起我兴趣的是滚动机制无缝地从ScrollView切换到ListView

请注意,在实际的ListView开始滚动之前,标签上方的内容会被推出视图。

我自己试过复制这个,但结果不成功。这是我采取的基本方法......

enter image description here

单次连续触摸事件(没有抬起手指)......

当用户滚动时,ListView会慢慢掩盖ImageView。在ImageView被100%覆盖并且ListView占据整个屏幕后,ListView开始滚动。

我目前正在ListView上听取触摸事件,如果已达到顶部,请致电requestDisallowInterceptTouchEvent上的ListView,即

@Override
public boolean onTouch(View v, MotionEvent event) {
  if (listViewAtTop) {
    v.requestDisallowInterceptTouchEvent(true);
  } else {
    v.requestDisallowInterceptTouchEvent(false);
  }
  return false;
}

只有当您抬起手指并继续滚动时,切换滚动上下文才有效。

是否有不同的方法可以达到预期的效果?

7 个答案:

答案 0 :(得分:9)

Android 5.0 Lollipop(API 21)添加了嵌套滚动支持。

据我所知,ListView(AbsListView)和ScrollView现在支持此功能(如果在API 21上运行),但必须在滚动视图上启用它。

通过电话有两种方式 setNestedScrollingEnabled(true)或布局属性android:nestedScrollingEnabled =" true" (没有证件)

要了解它的工作原理,或者为自定义小部件支持此功能,关键方法是:

不幸的是,没有任何指南或培训可以解释除了JavaDoc本身以外它是如何工作的,而JavaDoc本身相当轻,除了ScrollView之外没有其他例子。

答案 1 :(得分:7)

将最新的支持包“com.android.support:support-v4:22.1.1”添加到您的项目中。试试这个:

<android.support.v4.widget.NestedScrollView
        android:id="@+id/nScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

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

默认情况下,嵌套滚动已启用。

答案 2 :(得分:1)

在试图弄清楚如何自己解决这个问题时,我首先发现了这个问题;然而,答案并没有真正涉及太多细节。我确实找到了很多很好的资源,所以如果其他人发现自己在寻找这个,我会在下面链接它们。这种效果的术语是&#34; Sticky Scrolling&#34;。


一篇文章谈论&#34;同步滚动&#34;。

http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html


一个很好的视频展示了一些Android滚动技巧,&#34; Quick Return&#34;和#34; Sticky Scrolling&#34;。

https://www.youtube.com/watch?v=PL9s0IJ9oiI

代码: https://code.google.com/p/romannurik-code/source/browse/misc/scrolltricks


最后,这是另一个使用listView而不是ScrollView展示相同效果。

https://www.youtube.com/watch?v=rk-tLisxSgM

代码: https://github.com/jatago/list_sticky_scroll_trick

答案 3 :(得分:0)

我发现了一种替代方法&#39;这很简单......只使用ListView添加透明标题。

答案 4 :(得分:0)

我一直想要达到同样的效果。我想在GitHub中找到一个名为ObservableScrollView的相关库,它需要通过TouchInterceptFramework在后端进行更多的工作,但至少它甚至可以用于棒棒糖前设备。它不仅支持子滚动视图和列表视图,还支持recyclerviews。这是链接:

https://github.com/ksoichiro/Android-ObservableScrollView

我希望他们很快就会考虑将棒棒糖和棒棒糖前设备嵌套滚动作为其设计标准的一部分。这是一个好兆头。

答案 5 :(得分:0)

这是虚拟布局的典型示例。起初看起来不太明显的东西。基本上情况是这样的。

灰色区域 - &gt; FrameLayout 接下来是一个列表视图,它填满整个framelayout,然后是一个与listview的上半部分重叠的imageview。 listview的第一项是虚拟项目,其高度与imageview的高度相同。 (注意:实际数据从第二个元素开始)

下一步很容易 按照列表视图的滚动翻译Imageview。

我认为这是避免嵌套滚动的最佳方法

答案 6 :(得分:0)

我正在使用类似的东西,我认为它可以正常工作

vaddps

在scrollView是父级的地方,我正在监听onScroll事件(它是在其下面的扩展名viewTreeObserver.addOnScrollListener)。然后,根据我是否滚动了初始偏移量,我要启用/禁用子recyclerView(类似于ListView或其他scrollView)滚动。