Android прокрутки во время перетаскивания - PullRequest
9 голосов
/ 25 марта 2011

Привет, я пытаюсь сделать перетаскивание на ListView.Работает отлично.Но я потерял способность нажимать и прокручивать.Как мне сохранить эти два?Я думал, что перетаскивание должно происходить при длительном нажатии элемента вместо обычного нажатия.Вот мой onTouch, который находится в MyListView, который расширяет ListView

@Override
    public boolean onTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        final int x = (int) ev.getX();
        final int y = (int) ev.getY();  

        if (action == MotionEvent.ACTION_DOWN && x < this.getWidth()/4) {
            this._dragMode = true;
        }

        if (!this._isDragNDrop) 
            return super.onTouchEvent(ev);

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                this._startPosition = pointToPosition(x,y);
                if (this._startPosition != INVALID_POSITION) {
                    int mItemPosition = this._startPosition - getFirstVisiblePosition();
                    this._dragPointOffset = y - getChildAt(mItemPosition).getTop();
                    this._dragPointOffset -= ((int)ev.getRawY()) - y;
                    startDrag(mItemPosition,y);
                    drag(x,y);
                }   
                break;
            case MotionEvent.ACTION_MOVE:
                drag(x,y);
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
            default:
                this._dragMode = false;
                //_isDragNDrop = false;
                this._endPosition = pointToPosition(x,y);
                stopDrag(this._startPosition - getFirstVisiblePosition());
                if (this._dropListener != null && this._startPosition != INVALID_POSITION && this._endPosition != INVALID_POSITION) 
                    this._dropListener.onDrop(this._startPosition, this._endPosition);
                break;
        }
        return true;
    }

Ответы [ 5 ]

5 голосов
/ 16 апреля 2011

Я только что реализовал перетаскивание списка в своем приложении, перетаскивание начинается при долгом нажатии на элемент.

Исходный код находится на GitHub: DraggableListView , у меня есть сообщение в блоге для его описания. Надеюсь, это поможет вам.

3 голосов
/ 26 октября 2012

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

...
thumb.setOnDragListener(new Drag());
...

public class Drag implements OnDragListener{
public static int PositionOfDraggedItem = -1;
      public int PositionOfItemDraggedOver = -1;

public Drag() {}

@Override
public boolean onDrag(View v, DragEvent event)
{
    final int action = event.getAction();
    boolean state = true;

    View root = v.getRootView();
    ListView List = (ListView) root.findViewById(android.R.id.list);
    Object holder = v.getTag() instanceof OrderHolder? (OrderHolder)v.getTag() : v.getTag();

    String BookId = holder instanceof OrderHolder? String.valueOf(((OrderHolder)holder).id) : (String)holder;

    switch(action)
    {
        case DragEvent.ACTION_DRAG_STARTED:

            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            if( PositionOfDraggedItem != -1 )
            {
                if( this.PositionOfItemDraggedOver != PositionOfDraggedItem )
                {
                    if( v.getBackground() != null )
                        v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row_ovr));
                }
            }
            break;
        case DragEvent.ACTION_DRAG_LOCATION:
            /**
             * Set the item being
             * here, as it will not
             * provide location data
             * anywhere else
             */
            if( PositionOfDraggedItem == -1 )
                PositionOfDraggedItem = List.getPositionForView(v);

            /**
             * Set the view thats
             * being dragged over
             */
            this.PositionOfItemDraggedOver = List.getPositionForView(v);

            int PositionOfLastVisibleView = List.getLastVisiblePosition();
            int PositionOfFirstVisibleView = List.getFirstVisiblePosition();

            if( this.PositionOfItemDraggedOver != -1 && ( this.PositionOfItemDraggedOver != PositionOfDraggedItem ) ){
                if( this.PositionOfItemDraggedOver == PositionOfLastVisibleView-1 || this.PositionOfItemDraggedOver == PositionOfLastVisibleView || this.PositionOfItemDraggedOver == PositionOfLastVisibleView+1 ){
                    List.smoothScrollToPosition(PositionOfLastVisibleView+1);
                }else if( this.PositionOfItemDraggedOver == PositionOfFirstVisibleView-1 || this.PositionOfItemDraggedOver == PositionOfFirstVisibleView+1 || this.PositionOfItemDraggedOver == PositionOfFirstVisibleView ){
                    List.smoothScrollToPosition(PositionOfFirstVisibleView-1);
                }
            }
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            if( v.getBackground() != null )
                v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row));
            break;
        case DragEvent.ACTION_DROP:
            if(event != null)
            {
                ClipData data = event.getClipData();
                if( data != null && data.getItemCount() > 0 )
                {
                    if( !data.getItemAt(0).getText().toString().equalsIgnoreCase(BookId) )
                    {
                        if( v.getBackground() != null )
                            v.setBackgroundDrawable(v.getContext().getResources().getDrawable(drawable.row));
                        /**
                         * Ordering info for
                         * book being dragged
                         */
                        String oShelfOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_SHELFORDER, 
                                booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(data.getItemAt(0).getText().toString()));
                        String oBookOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_BOOKSORDER, 
                                booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(data.getItemAt(0).getText().toString()));

                        /**
                         * Ordering info
                         * for book being dragged
                         * to
                         */
                        String dShelfOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_SHELFORDER, 
                                booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(BookId));
                        String dBookOrder = BookManager.item(v.getContext().getContentResolver(), dbhelper.BOOKS_BOOKSORDER, 
                                booksprovider.GetUri(dbhelper.BOOKS), Long.parseLong(BookId));

                        /**
                         * Update book being dragged
                         */
                        ContentValues args = new ContentValues();
                        args.put(dbhelper.BOOKS_SHELFORDER, dShelfOrder);
                        args.put(dbhelper.BOOKS_BOOKSORDER, dBookOrder);
                        BookManager.updateBook(v.getContext().getContentResolver(), data.getItemAt(0).getText().toString(), args);

                        /**
                         * Update book being dragged to
                         */
                        ContentValues values = new ContentValues();
                        values.put(dbhelper.BOOKS_SHELFORDER, oShelfOrder);
                        values.put(dbhelper.BOOKS_BOOKSORDER, oBookOrder);
                        BookManager.updateBook(v.getContext().getContentResolver(), BookId, values);

                        if( v.getContext() instanceof OrderBooks ){
                            ((OrderBooks)v.getContext()).adapter.refresh();
                            ((OrderBooks)v.getContext()).adapter.notifyDataSetChanged();

                            PositionOfDraggedItem = -1;
                        }
                    }
                }
            }
            break;
        case DragEvent.ACTION_DRAG_ENDED:
            if( event != null && event.getResult())
            {
                v.invalidate();
            }
            break;
    }
    return state;
}

}

Не работал над этим некоторое время, обновлен, чтобы отразить последние изменения.

2 голосов
/ 25 июля 2012

Проверьте этот вопрос для получения дополнительной помощи. У меня также есть компонент под названием DragSortListView, который я потратил много времени на доработку. Вы можете найти его здесь:

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

0 голосов
/ 01 февраля 2016

Ребята, я немного изменил код Рики, и это работает для меня.

if (PositionOfItemDraggedOver == PositionOfLastVisibleView)
    order_item_list_lv.smoothScrollToPosition(PositionOfLastVisibleView + 1);

if (PositionOfItemDraggedOver == PositionOfFirstVisibleView)
   order_item_list_lv.smoothScrollToPosition(PositionOfFirstVisibleView - 1);
0 голосов
/ 22 августа 2013

Я реализовал это решение, которое работает для меня. Следующий метод находится в моей Activity, и он вызывается в моем dragEventListener, когда dragEvent имеет значение ACTION_DRAG_ENTERED. Некоторые атрибуты, которые я объявил:

//first visible item (getFirstVisiblePosition() does not work for me)
int firstVisible;
//number of scrolls
int nbrScroll;
//my listview to scroll
ListView mListView;
//the adapter of my listview
SimpleAdapter mAdapter;

...

public void scrollDrag(int position) {
            //this is the position of the item in my listview
            //to scroll down
            //test if the item entered is the last visible
    if (position == mListView.getLastVisiblePosition()
            && id < mListView.getCount()) {
        mAdapter.notifyDataSetChanged();
        mRightDrawerList.post(new Runnable() {
            @Override
            public void run() {
                //scroll down
                mListView.smoothScrollToPosition(mListView
                        .getLastVisiblePosition() + 1);
                firstVisible++;
            }
        });
            //to scroll up
            //test if the item entered is the first visible
    } else if (position == firstVisible && position !=0) {
        mAdapter.notifyDataSetChanged();
        mListView.post(new Runnable() {
            @Override
            public void run() {
                //scroll up
                mListView.smoothScrollToPosition(firstVisible-1);
                firstVisible --;
            }
        });
    }
}

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...