我有一个普通的RecyclerView
,在它上面有一个透明的View
实现GestureListener
,它们的大小基本相同RecyclerView
。
该GestureListener
会听滚动和一扔手势,并通过该MotionEvent
给RecyclerView
它的下面。
我已经RecyclerView
能够滚动和投掷。但是,我找不到将 click 事件传递给RecyclerView
's项目的方法。
我已经知道这是因为ACTION_DOWN
在GestureListener
. 事实上,GestureListener
有一个onSingleTap()
方法供您覆盖,每当我执行单击时都会调用此方法。
根据这篇文章,我尝试OnTouchListener
为我的 itemView设置一个并监听ACTION_UP
事件。但是,onTouch()
从不调用该方法。
下面是我的做法:
1. 在透明的 GestureListener 中创建一个回调
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (scrollDetector == null) return false;
scrollDetector.onSingleTap(e);
return true;
}
在activity中配置回调,并传递MotionEvent
给RecyclerView
@Override
public void onSingleTap(MotionEvent e) {
mRecyclerView.onTouchEvent(e);
}
设置OnTouchListener
为适配器中的 itemView:
itemView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
v.performClick();
return true;
}
return false;
}
});
使用调试器,我可以看到它mRecyclerView.onTouchEvent(e)
被调用了;但是onTouch()
itemView 的没有被调用。
所以......我应该如何正确地将 传递MotionEvent
给 itemView?
你可能会问—— “为什么要在 RecyclerView 之上放置一个 GestureListener?”
这是因为我需要RecyclerView
在RecyclerView
滚动时更改 的高度。但是,如果我使用RecyclerView
's执行此操作addOnScrollListener
,则 的值dy
将在负值和正值之间波动,因为 dy 也受其高度的影响。并且波动也会反映到UI上。
因此,我需要一个滚动检测器,它在滚动时不会改变其高度,只需通过RecyclerView
编程调用scrollBy()
and将 scroll 和 fling 值传递给fling()
。
愚蠢的我。我应该使用dispatchTouchEvent(MotionEvent e)
而不是onTouchEvent(MotionEvent e)
.
然而,这还不够。
简单地dispatchTouchEvent(e)
使用 GestureListener 中的 MotionEvent调用是行不通的,因为这e
是一个ACTION_UP
事件。
要模拟点击,您需要ACTION_DOWN
和ACTION_UP
。
而且 itemView 不需要设置,OnTouchListener
因为你已经模拟过了
代码:
@Override
public void onSingleTap(MotionEvent e) {
long downTime = SystemClock.uptimeMillis();
long upTime = downTime + 100;
MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,
e.getX(), e.getY(), 0);
mRecyclerView.dispatchTouchEvent(downEvent);
MotionEvent upEvent = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP,
e.getX(), e.getY(), 0);
mRecyclerView.dispatchTouchEvent(upEvent);
downEvent.recycle();
upEvent.recycle();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句