【发布时间】:2016-07-17 08:21:28
【问题描述】:
问题
我正在尝试模拟 Google Play 应用程序的确切行为。
目前,当您滚动浏览“热门游戏”之类的类别并触摸列表时,该单元格以及 RecyclerView 处理触摸事件,您可以看出它们都在处理它,因为出现了涟漪当您按住手指以及滚动停止时。或者,如果您在列表仍在移动时单击单元格,则该内容会立即打开。
默认行为是,如果您在移动时将手指放在下方,则滚动会立即停止,然后它会消耗该触摸事件,这意味着单元格永远不会被告知该触摸。当您的应用程序主要内容位于 RecyclerView 中时,这非常令人恼火,并且如果用户连续滚动然后单击单元格,则需要他们单击两次,因为第一次单击已被停止滚动消耗,即使列表几乎没有移动。
到目前为止我所做的尝试
起初我认为RecyclerView 中一定有某种标志,告诉它不要消耗触摸事件。我查看了 Android 源代码并通过 Android 文档进行了路由,但无济于事。
然后我尝试使用onInterceptTouchEvent 捕获触摸事件并手动告诉我的视图它正在被触摸;
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
View myCell = recyclerView.findChildViewUnder(event.getX(), event.getY());
myCell.dispatchTouchEvent(event);
return super.onInterceptTouchEvent(event);
}
这里,dispatchTouchEvent 似乎没有做任何事情,即使我得到的视图有我在适配器中设置的相应标签。
我试过用我的密码机枪从各个角度解决这个问题;玩requestDisallowInterceptTouchEvent,手动调用onTouch 并覆盖RecyclerView 及以后的所有听众。
似乎没有任何效果。我确信必须有一个优雅的解决方案来解决这个问题,而且我在通往精神错乱的道路上某个地方浏览了一个重要的细节?尤其是因为 Google 自己的应用程序就是这样运行的。
请帮忙! :) 谢谢。
解决方案
感谢 Jagoan Neon,我们找到了解决方案。为了便于使用,我最终将他的答案包装在自定义 RecyclerView 中。
public class MultiClickRecyclerView extends RecyclerView {
public MultiClickRecyclerView(Context context) {
super(context);
}
public MultiClickRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MultiClickRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && this.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) {
this.stopScroll();
}
return super.onInterceptTouchEvent(event);
}
}
【问题讨论】:
-
你知道为什么手动停止滚动会得到recyclerView里面的itemView的touch事件吗?
标签: android android-recyclerview touch-event smooth-scrolling