Recyclerview перетаскивание на касание

Я использовал ItemTouchHelper для реализации перетаскивания в recyclerview. Это работает нормально. Но работает только на долгое нажатие. Мне нужно сделать это с onTouch

ItemTouchHelper.Callback itemTouchHelperCallback = new ItemTouchHelper.Callback() {
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        Collections.swap(strings, viewHolder.getAdapterPosition(), target.getAdapterPosition());
        adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //TODO
    }

   //defines the enabled move directions in each state (idle, swiping, dragging).
     @Override
     public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
         return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
             ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.START | ItemTouchHelper.END);
         }
    };

Это код, который я использовал. Помогите пожалуйста мне!!!


person Jyoti JK    schedule 11.01.2019    source источник
comment
вы можете проверить этот пример....journaldev.com/23208/ android-recyclerview-drag-and-drop   -  person Amit Jangid    schedule 11.01.2019
comment
Вы можете посмотреть на это решение, которое я сделал: stackoverflow.com/a/57204561/878126   -  person android developer    schedule 25.07.2019


Ответы (2)


  1. Переопределить ItemTouchHelper isLongPressDragEnabled и вернуть false

    https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback#isLongPressDragEnabled()

    override fun isLongPressDragEnabled(): Boolean = false

  2. Добавьте обратный вызов в реализацию ViewHolder и используйте это

    buttonToDrag.setOnTouchListener { v, event ->
        listener.onTouch(this, event)
        false
    }
    
  3. В действии или фрагменте используйте startDrag

    private lateinit var itemTouchHelper: ItemTouchHelper
    
    override fun onTouch(viewHolder: RecyclerView.ViewHolder, event: MotionEvent) {
        if (event.actionMasked == MotionEvent.ACTION_DOWN) {
            itemTouchHelper.startDrag(viewHolder)
        }
    }
    

Я нашел реализацию в документе https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper#startdrag

Я пробовал это лично, и это работает как шарм.

person Dewey Reed    schedule 11.01.2019

Вы можете использовать следующий код внутри onBindViewHolder, чтобы начать перетаскивание касанием

holder.layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {

        ClipData data = ClipData.newPlainText("", "");
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);
        view.setVisibility(View.INVISIBLE);

        return false;
    }
}); 

Макет означает макет вашего товара. после того, как вы можете использовать DragListener для всех других событий, например

DragEvent.ACTION_DRAG_STARTED
DragEvent.ACTION_DRAG_ENTERED
DragEvent.ACTION_DRAG_EXITED
DragEvent.ACTION_DROP
DragEvent.ACTION_DRAG_ENDED
person J.D    schedule 11.01.2019