问题
我试图模拟Google Play应用程序的确切行为。
目前,当您滚动浏览类似“热门游戏”的类别并触摸列表时,该单元格以及 RecyclerView
处理触摸事件,你可以告诉他们正在处理它,因为当你按住手指时出现波纹以及滚动停止。或者,如果您在列表仍在移动时单击一个单元格,则会立即打开该内容。
默认行为是滚动在您移动时将手指放下时立即停止,然后消耗该触摸事件,这意味着细胞永远不会被告知该触摸。当您的应用程序主要内容在a中时,这非常令人恼火 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
超越。
似乎没有什么工作。我敢肯定必须有一个优雅的解决方案,我已经在精神错乱的道路上掠过一个重要的细节?特别是因为谷歌自己的应用程序以这种方式运行。
请帮忙! :) 谢谢。
解决方案
感谢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);
}
}