Просмотр списка Android Перетаскивание

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

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

Его использование очень похоже на TouchInterceptor (на котором основан код), хотя были сделаны значительные изменения в реализации.

DragSortListView имеет плавную и предсказуемую прокрутку при перетаскивании и перемещении элементов. Перетасовка элементов намного более согласована с положением элемента перетаскивания / плавания. Поддерживаются элементы списка разнородных высот. Прокрутка с перетаскиванием настраивается (я демонстрирую быстрое перетаскивание прокрутки по длинному списку – не то, что приложение приходит на ум). Верхние и нижние колонтитулы соблюдаются. и т.д.?? Взглянуть.

Добавляю этот ответ для тех, кто говорит об этом.

Недавно был эпизод DevBytes ( перетаскивание и перегруппировка элементов ListView ), в котором объясняется, как это сделать

Здесь вы можете найти здесь пример кода.

В основном этот код состоит в том, что он создает dynamic listview список, dynamic listview список, поддерживающий перетаскивание и замену ячеек. Так что вы можете использовать DynamicListView вместо вашего основного ListView и именно это вы внедрили ListView с перетаскиванием.

Библиотека DragListView делает это очень аккуратно с очень приятной поддержкой пользовательских анимаций, таких как анимация возвышения. Он также по-прежнему поддерживается и обновляется на регулярной основе.

Вот как вы его используете:

1: сначала добавьте lib в gradle

 dependencies { compile 'com.github.woxthebox:draglistview:1.2.1' } 

2: Добавить список из xml

 <com.woxthebox.draglistview.DragListView android:id="@+id/draglistview" android:layout_width="match_parent" android:layout_height="match_parent"/> 

3: Установите прослушиватель перетаскивания

 mDragListView.setDragListListener(new DragListView.DragListListener() { @Override public void onItemDragStarted(int position) { } @Override public void onItemDragEnded(int fromPosition, int toPosition) { } }); 

4: Создайте адаптер, переопределенный с помощью DragItemAdapter

 public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder> public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) { super(dragOnLongPress); mLayoutId = layoutId; mGrabHandleId = grabHandleId; setHasStableIds(true); setItemList(list); } 

5: Внедрение зрителя, который простирается от DragItemAdapter.ViewHolder

 public class ViewHolder extends DragItemAdapter.ViewHolder { public TextView mText; public ViewHolder(final View itemView) { super(itemView, mGrabHandleId); mText = (TextView) itemView.findViewById(R.id.text); } @Override public void onItemClicked(View view) { } @Override public boolean onItemLongClicked(View view) { return true; } } 

Для получения более подробной информации перейдите на страницу https://github.com/woxblom/DragListView

Теперь это довольно легко реализовать для RecyclerView с помощью ItemTouchHelper . Просто переопределите метод ItemTouchHelper.Callback из ItemTouchHelper.Callback :

  @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { mMovieAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } 

Довольно хороший учебник по этому вопросу можно найти на media.com: перетаскивание и прокрутка с помощью RecyclerView

Я обнаружил, что DragSortListView работал хорошо, хотя начать с него было проще. Вот краткий учебник по его использованию в Android Studio со списком в памяти:

  1. Добавьте это в зависимости build.gradle для вашего приложения:

     compile 'asia.ivity.android:drag-sort-listview:1.0' // Corresponds to release 0.6.1 
  2. Создайте ресурс для идентификатора дескриптора перетаскивания, создав или добавив values/ids.xml :

     <resources> ... possibly other resources ... <item type="id" name="drag_handle" /> </resources> 
  3. Создайте макет для элемента списка, который содержит ваше любимое изображение с ручкой перетаскивания, и назначьте его идентификатор ID, который вы создали на шаге 2 (например, drag_handle ).

  4. Создайте макет DragSortListView, примерно так:

     <com.mobeta.android.dslv.DragSortListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dslv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" dslv:drag_handle_id="@id/drag_handle" dslv:float_background_color="@android:color/background_light"/> 
  5. Задайте производное ArrayAdapter с переопределением getView которое getView ваш элемент списка.

      final ArrayAdapter<MyItem> itemAdapter = new ArrayAdapter<MyItem>(this, R.layout.my_item, R.id.my_item_name, items) { // The third parameter works around ugly Android legacy. http://stackoverflow.com/a/18529511/145173 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); MyItem item = getItem(position); ((TextView) view.findViewById(R.id.my_item_name)).setText(item.getName()); // ... Fill in other views ... return view; } }; dragSortListView.setAdapter(itemAdapter); 
  6. Установите прослушиватель капли, который переупорядочивает элементы по мере их удаления.

      dragSortListView.setDropListener(new DragSortListView.DropListener() { @Override public void drop(int from, int to) { MyItem movedItem = items.get(from); items.remove(from); if (from > to) --from; items.add(to, movedItem); itemAdapter.notifyDataSetChanged(); } });