android - 被父级拦截后将 TouchEvent 调度到 Listview

标签 android listview touch-event

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

my layout

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

现在我想这样做:

向下滚动时,ListView 不得滚动。相反,必须转换 header ,使其看起来像 native ActionBar。

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

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

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

我尝试了一些方法,但它们并不适合我:

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

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

非常感谢并问候!

最佳答案

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

listView.smoothScrollByOffset(int offset);

要滚动 ListView 吗?

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

smoothScrollBy((int) distanceY, 1);

关于android - 被父级拦截后将 TouchEvent 调度到 Listview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19973614/

相关文章:

android - 使用 Android 应用程序运行脚本

android - 列表中的数据在滚动时重复

javascript - mousedown 事件未在平板电脑/手机、HTML5 Canvas 上触发

Android:为拖动扩展 onTouchEvent 的 ImageView

Android:WAITING firebase valueEventListener

android - 如何更改系统导航栏颜色

android - 在 AsyncTask 中使用 kotlin 初始化数据库

android - ListView 问题中的按钮动画

C++ winapi ListView NM_CUSTOMDRAW : not getting CDDS_ITEMPREPAINT

ios - 将触摸事件传递给 UICollectionViewCell 内容?