Перетащите и отпустите его на элемент RecyclerView Android

Я разрабатываю приложение для Android, имеющее экран, содержащий следующее:

  • Вид ресайклера, который содержит категории, как показано ниже.
  • Отдельное представление в botton, и пользователь должен перетащить его на элемент RecyclerView, и после его удаления пользователь покажет изменение в данных элемента RecyclerView (например, количество элементов в категории)

Мне нужна помощь в том, как реализовать этот процесс для перетаскивания объекта View в Recycler, следующий рисунок объясняет, что именно я хочу сделать, но не знаю, как это сделать.

введите описание изображения здесь

любая помощь очень ценится

Ответ 1

Начните с добавления draglistener в ваше раздутое представление в onCreateViewHolder вашего адаптера onCreateViewHolder.

view.setOnDragListener(new OnDragListener() {
        @Override
        public boolean onDrag(View view, DragEvent dragEvent) {

            switch (dragEvent.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    // drag has started, return true to tell that you're listening to the drag
                    return true;

                case DragEvent.ACTION_DROP:
                    // the dragged item was dropped into this view
                    Category a = items.get(getAdapterPosition());
                    a.setText("dropped");
                    notifyItemChanged(getAdapterPosition());
                    return true;
                case DragEvent.ACTION_DRAG_ENDED:
                    // the drag has ended
                    return false;
            }
            return false;
        }
    });

В случае ACTION_DROP вы можете либо изменить модель и вызвать notifyItemChanged(), либо напрямую изменить представление (которое не будет обрабатывать случай повторного связывания). Также в onCreateViewHolder добавьте longClickListener к вашему View, а в onLongClick запустите перетаскивание:

ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(view.getTag().toString(),
            mimeTypes, item);
view.setVisibility(View.GONE);
DragShadowBuilder myShadow = new DragShadowBuilder(view);

if (VERSION.SDK_INT >= VERSION_CODES.N) {
    view.startDragAndDrop(dragData, myShadow, null, 0);
} else {
    view.startDrag(dragData, myShadow, null, 0);
}

Для получения дополнительной информации о перетаскивании проверить сайт разработчиков Android