我有使用recyclerview实现的日历。要根据要求导航到上个月和下个月,客户需要滑动功能。
所以我使用以下代码实现了该功能:
sys.argv[1]
使用此touchListener,其日历的工作完全滑动功能。
但是添加此功能后,请单击recyclerview项 工作。当我删除触摸监听器时,单击recyclerview项目即可 完美。
我在代码中错过了什么?任何想法?两者不能一起工作。
这是OnSwipeTouchListener:
recyclerView.setOnTouchListener(new OnSwipeTouchListener(context) {
public void onSwipeTop() {
}
public void onSwipeRight() {
onPreviousMonth();
}
public void onSwipeLeft() {
onNextMonth();
}
public void onSwipeBottom() {
}
});
}
答案 0 :(得分:1)
我会考虑在您的RecyclerView上附加一个ItemTouchHelper。
实现是这样的:
#include <Windows.h>
#include <stdio.h>
HMODULE thisModule;
HHOOK hook;
LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam);
#ifdef __cplusplus // If used by C++ code,
extern "C" { // we need to export the C interface
#endif
__declspec(dllexport) void AttachHook(DWORD threadID) {
hook = SetWindowsHookEx(WH_CALLWNDPROC, LaunchListener, thisModule, threadID);
}
#ifdef __cplusplus
}
#endif
LRESULT CALLBACK LaunchListener(int nCode, WPARAM wParam, LPARAM lParam) {
// process event here
if (nCode >= 0) {
CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
if (cwp->message == WM_ACTIVATE) {
if (LOWORD(cwp->wParam) == WA_INACTIVE)
{
//the window being deactivated
}
else
{
//the window being activated
}
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
答案 1 :(得分:0)
您可以添加这样的逻辑
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
y1 = event.getY();
t1 = System.currentTimeMillis();
return true;
case MotionEvent.ACTION_UP:
x2 = event.getX();
y2 = event.getY();
t2 = System.currentTimeMillis();
if (x1 == x2 && y1 == y2 && (t2 - t1) < DURATION_TO_CONSIDER_CLICK) {
// Consider as normal click or tap
} else if ((t2 - t1) >= DURATION_TO_CONSIDER_CLICK) {
// Consider as long click or tap
} else if (x1 > x2) {
// Consider as left swipe
} else if (x2 > x1) {
// Consider as right swipe
}
return true;
}
return false;
}
请注意,这仅供参考,您可能需要稍微更改上述逻辑才能满足您的期望。 谢谢。
答案 2 :(得分:0)
您应确保TouchListener
不会消耗触摸事件。如果您从onTouch()方法返回true,则Android会将其视为已消耗,而不会将其传递给其他各种触摸处理程序(我假设它将包括ClickListener
)。