Проблемы с перетаскиванием списком в Android - PullRequest
1 голос
/ 26 августа 2011

Я начинающий Android. Я делаю проект Android, который имеет функцию, чтобы изменить порядок в списке. Я нашел открытый источник на https://github.com/commonsguy/cwac-touchlist#readme и имя модуля CWAC: TouchListView

Но во время моей реализации у меня есть некоторые проблемы, и я надеюсь, что кто-то может мне помочь,

  1. Я хочу отключить функцию удаления, когда перемещаю элемент списка по горизонтали, но не могу ... Если я прокомментирую код удаления в случае TouchListView.onTouchEvent () MotionEvent.ACTION_CANCEL Произойдет неожиданное поведение.

  2. Кроме того, я хочу, чтобы при перетаскивании элемента была какая-то анимация, например, страница закладки браузера дельфинов, но я не знаю, должен ли он реализовывать DragListener ??

Однако у меня исправлена ​​ошибка.

@Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (mGestureDetector != null) {
            mGestureDetector.onTouchEvent(ev);
        }
        if ((mDragListener != null || mDropListener != null) && mDragView != null) {
            int action = ev.getAction();
            switch (action) {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                Rect r = mTempRect;
                mDragView.getDrawingRect(r);
                stopDragging();

                if (mRemoveMode == SLIDE_RIGHT && ev.getX() > r.left + (r.width() * 3 / 4)) {
                    if (mRemoveListener != null) {
                        mRemoveListener.remove(mFirstDragPos);
                    }
                    unExpandViews(true);
                } else if (mRemoveMode == SLIDE_LEFT && ev.getX() < r.left + (r.width() / 4)) {
                    if (mRemoveListener != null) {
                        mRemoveListener.remove(mFirstDragPos);                      
                    }
                    unExpandViews(true);
                } else {
                    if (mDropListener != null && mDragPos >= 0 && mDragPos < getCount() - 1) {
                        mDropListener.drop(mFirstDragPos, mDragPos);
                    }
                    unExpandViews(false);
                }
                break;

            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                int x = (int) ev.getX();
                int y = (int) ev.getY();
                dragView(x, y);
                int itemnum = getItemForPosition(y);
                if (itemnum >= 0) {
                    if (action == MotionEvent.ACTION_DOWN || itemnum != mDragPos) {
                        if (mDragListener != null) {
                            mDragListener.drag(mDragPos, itemnum);
                        }
                        mDragPos = itemnum;
                        doExpansion();
                    }
                    int speed = 0;
                    adjustScrollBounds(y);
                    if (y > mLowerBound) {
                        // scroll the list up a bit
                        speed = y > (mHeight + mLowerBound) / 2 ? 16 : 4;
                    } else if (y < mUpperBound) {
                        // scroll the list down a bit
                        speed = y < mUpperBound / 2 ? -16 : -4;
                    }
                    if (speed != 0) {
                        int ref = pointToPosition(0, mHeight / 2);
                        if (ref == AdapterView.INVALID_POSITION) {
                            // we hit a divider or an invisible view, check
                            // somewhere else
                            ref = pointToPosition(0, mHeight / 2 + getDividerHeight() + 64);
                        }
                        View v = getChildAt(ref - getFirstVisiblePosition());
                        if (v != null) {
                            int pos = v.getTop();
                            setSelectionFromTop(ref, pos - speed);                          
                        }
                    }
                }
                break;
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }

Для случая MotionEvent.ACTION_CANCEL, если я перетаскиваю элемент на list.getCount, он выдаст исключение, поэтому я заменяю условие

от

if (mDropListener != null && mDragPos >= 0 && mDragPos < getCount() ) {
      mDropListener.drop(mFirstDragPos, mDragPos);
}

до

if (mDropListener != null && mDragPos >= 0 && mDragPos < getCount() - 1) {
      mDropListener.drop(mFirstDragPos, mDragPos);
}

Тогда исключение будет исправлено.

Может ли кто-нибудь помочь мне ?? Большое спасибо.

1 Ответ

0 голосов
/ 26 августа 2011

Я хочу отключить функцию удаления при перемещении элемента списка по горизонтали, но я не могу

Использовать пользовательский атрибут remove_mode со значением "none".Например:

<?xml version="1.0" encoding="utf-8"?>
<com.commonsware.cwac.tlv.TouchListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tlv="http://schemas.android.com/apk/res/com.commonsware.cwac.tlv.demo"

    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:drawSelectorOnTop="false"
    tlv:normal_height="64dip"
    tlv:grabber="@+id/icon"
    tlv:remove_mode="none"
/>

Я хочу иметь анимацию при перетаскивании элемента, например страницу закладки браузера дельфинов, но я не знаю, будет ли это

Я не будусмогу помочь тебе с этим, прости.

...