Android Swipe手势和项目单击在RecyclerView中都无法一起使用

时间:2019-07-11 06:19:31

标签: android android-recyclerview android-calendar swipe-gesture

我有使用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() {

        }
    });

}

3 个答案:

答案 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)。