Android, реализующий onTouch с OnLongClickListener ListView

#android #listview #onlongclicklistener #ontouch

#Android #просмотр списка #onlongclicklistener #ontouch

Вопрос:

Я пытаюсь объединить ListViewRemovalAnimation (http://developer.android.com/shareables/devbytes/ListViewRemovalAnimation.zip ) с перетаскиванием ячеек и их перестановкой (http://developer.android.com/shareables/devbytes/ListViewDraggingAnimation.zip )

Я пытаюсь вернуть false, когда пользователь удерживает просмотр в течение x секунд в onTouch и, таким образом, вызывает LongClick.

Однако переход к удалению, похоже, работает отлично, но я, похоже, не могу найти способ вызвать OnLongClickListener, когда это необходимо. Я попытался определить разницу во времени между тем, когда пользователь впервые нажимает на просмотр, и текущим временем, но, похоже, это не сработало. Я также думал об использовании обработчика с запускаемым, но я не мог придумать способ выполнить то, что я хотел.

У меня такое чувство, что я подхожу к этому с неправильной точки зрения, но любая помощь по удалению с помощью перетаскивания и перестановки listview была бы оценена 🙂

Вот код для onTouch:

 public boolean onTouch(final View v, MotionEvent event) {
        time = event.getDownTime();
        if (mSwipeSlop < 0) {
            mSwipeSlop = ViewConfiguration.get(ListViewDraggingAnimation.this).
                    getScaledTouchSlop();
        }
        if(SystemClock.uptimeMillis() - time > 2000) {
            return false;
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (mAnimating) {
                    // Multi-item swipes not handled
                    return false;
                }
                mItemPressed = true;
                mDownX = event.getX();
                break;
            case MotionEvent.ACTION_CANCEL:
                setSwipePosition(v, 0);
                mItemPressed = false;
                break;
            case MotionEvent.ACTION_MOVE:
            {
                ifNameTaken.setText("debug69");
                if (mAnimating) {
                    return false;
                }
                float x = event.getX();
                if (isRuntimePostGingerbread()) {
                    x  = v.getTranslationX();
                }
                float deltaX = x - mDownX;
                float deltaXAbs = Math.abs(deltaX);
                if (!mSwiping) {
                    if (deltaXAbs > mSwipeSlop) {
                        mSwiping = true;
                        listView.requestDisallowInterceptTouchEvent(true);
                    }
                }
                if (mSwiping) {
                    setSwipePosition(v, deltaX);
                }
            }
            break;
            case MotionEvent.ACTION_UP:
            {
                if (mAnimating) {
                    return false;
                }
                // User let go - figure out whether to animate the view out, or back into place
                if (mSwiping) {
                    float x = event.getX();
                    if (isRuntimePostGingerbread()) {
                        x  = v.getTranslationX();
                    }
                    float deltaX = x - mDownX;
                    float deltaXAbs = Math.abs(deltaX);
                    float fractionCovered;
                    float endX;
                    final boolean remove;
                    if (deltaXAbs > v.getWidth() / 4) {
                        // Greater than a quarter of the width - animate it out
                        fractionCovered = deltaXAbs / v.getWidth();
                        endX = deltaX < 0 ? -v.getWidth() : v.getWidth();
                        remove = true;
                    } else {
                        // Not far enough - animate it back
                        fractionCovered = 1 - (deltaXAbs / v.getWidth());
                        endX = 0;
                        remove = false;
                    }
                    // Animate position and alpha
                    long duration = (int) ((1 - fractionCovered) * SWIPE_DURATION);
                    animateSwipe(v, endX, duration, remove);
                } else {
                    mItemPressed = false;
                }
            }
            break;
            default:
                return false;
        }
        return true;
    }
  

Я также не редактировал какой-либо код ListViewDraggingAnimation onLongClick.

РЕДАКТИРОВАТЬ: я попытался поместить сравнение между SystemClock.uptimeMillis() — event.getDownTime() > 2000 вне переключателя, думая, что Action_Down выполняется только тогда, когда пользователь нажимает только вниз, но это все равно не вернуло false . Я думаю, что проблема может заключаться в самом логическом сравнении

Ответ №1:

Используйте Log.d() для проверки значений переменных с помощью logcat, похоже, у вас проблемы с тестированием.

onLongClick был бы функцией вне этой функции onTouch