【问题标题】:Dispatch TouchEvent to Listview after it's intercepted by parent被父级拦截后将TouchEvent分派到Listview
【发布时间】:2013-11-14 09:12:54
【问题描述】:

我的布局看起来像这样:

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

现在我想这样做:

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

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

一切都很好。 但现在这是我的问题

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

我尝试了一些方法,但对我没有用:

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

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

非常感谢和问候!

【问题讨论】:

  • 我愿意做你所做的!你有一个如何覆盖 OnIntercetpTouchEvent() 方法的例子吗?

标签: android listview touch-event


【解决方案1】:

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

listView.smoothScrollByOffset(int offset);

滚动列表视图?

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

smoothScrollBy((int) distanceY, 1);

【讨论】:

  • uuuh...这听起来很有希望!我现在正在尝试这个,让你知道它有效:)
  • 你的回答没有完成这项工作。但这对我帮助很大:调用 ListView 的 smoothScrollBy((int) distanceY, 1) 可以正常工作!如果你编辑你的答案,我接受它:)
【解决方案2】:

感谢 MungoRae 的回答,我能弄明白(请给他点赞!)

listView.smoothScrollBy(int offset, int durationInMillis)

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多