2

我有一个看起来像这样的布局:

我的布局

ViewPager 内部有许多 Fragment,每个 Fragment 都包含一个 ListView。

现在我想这样做:

通过向下滚动,ListView 不能滚动。相反,标题必须进行转换,使其看起来像一个原生 ActionBar。

我通过在我的活动的根布局中拦截 TouchEvent 来做到这一点。我已经覆盖了我的父布局的 onInterceptTouchEvent() 方法,并通过检索当前可见的 ListView 并检查 firstVisibleItem 是否是第一个并且它是否完全可见来检查是否应该拦截 TouchEvent。如果 TouchEvent 应该被拦截,则调用我自定义的 OnGesutreListener 的 onScroll() 方法。所以“动画”进度取决于滚动偏移量。

所有这些都很好。但现在这是我的问题

转换已准备就绪,用户仍向下滚动。作为用户,我希望 ListView 向下滚动。但是 TouchEvent 没有被分派到 ListView,因为它仍然被父布局拦截。只有在再次上下移动手指后才会再次调用 onInterceptTouchEvent (现在父布局还没有拦截)并且列表是可滚动的。

我尝试了一些东西,但它们对我没有用:

  • 我试图在我父母布局的 onTouchEvent() 方法中手动调用我的 listView 的 onTouchEvent - 注意发生
  • 我试图在我的 onScroll 方法中手动调用我的 listView 的 onTouchEvent,这也没有成功。

也许你们中的一些人知道如何解决这个问题。

非常感谢和问候!

4

3 回答 3

3

您能否尝试在父 onTouchEvent 中获取手指移动的 x 位置,然后使用

listView.smoothScrollByOffset(int offset);

滚动列表视图?

编辑:根据反馈,它应该是:

smoothScrollBy((int) distanceY, 1);
于 2013-11-14T09:45:45.723 回答
1

感谢MungoRae的回答,我可以弄清楚(请给他一个赞成票!)

listView.smoothScrollBy(int offset, int durationInMillis)

这对我来说很好。偏移量是滚动距离Y,持续时间设置为1毫秒

于 2013-11-14T12:14:42.513 回答
1

您可以使用View.requestDisallowInterceptTouchEvent()。它将启用和禁用视图拦截触摸事件的能力。

在触摸时在父布局上设置requestDisallowInterceptTouchEvent(true),它将使列表视图能够处理触摸事件。

于 2013-11-14T12:22:58.790 回答