Подтвердить что ты не робот

Перетаскивание сортировки адаптера курсора и адаптера списка

Я очень удивлен, что есть такая небольшая информация о перетаскивании с адаптером курсора и адаптером списка.

Самый близкий пост, который я нашел в stackoverflow, следующий:

qaru.site/info/259793/...

Но мне непонятно, как реализовать то, что предлагает CommonsWare, - пояснение будет очень полезно.

Пока я привязываю данные курсора к адаптеру списка и устанавливаю его следующим образом:

mMyCursorAdapter = new MyCursorAdapter(getActivity(), null);
setListAdapter(mMyCursorAdapter);
getLoaderManager().initLoader(0, null, this);

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

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

4b9b3361

Ответ 1

Это сообщение в блоге Джейсона Макрейнольдса (включая образец проекта) мне очень помогли.

В нем объясняется, как использовать библиотеку Карла А. Бауэра Drag-Sort-ListView с помощью CursorAdapter и SqLite. Он показывает, как сохранить новое упорядоченное состояние ListView в базе данных.

Ответ 2

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

Музыкальное приложение Android по умолчанию имеет все классы, которые вам понадобятся.

Во-первых, вам нужно получить свой собственный ListView, который позволяет перетаскивать.

Это можно найти здесь - TouchInterceptor.java.

Вам также потребуется захватить свой собственный Cursor, который использовался для перемещения элементов в вашем ListView. Это внутренний класс, называемый NowPlayingCursor.

Это можно найти здесь - TrackBrowserActivity.java

NowPlayingCursor extends AbstractCursor и используется для возврата очереди. Метод makeNowPlayingCursor() определен, где вы будете писать большую часть своего собственного кода. Вместо того, чтобы возвращать очередь, вам нужно вернуть элементы, которые вы заинтересованы в перемещении, какими бы они ни были.

Чтобы использовать TouchInterceptor, вам нужно реализовать TouchInterceptor.DropListener.

   private TouchInterceptor.DropListener mDropListener =
        new TouchInterceptor.DropListener() {
        public void drop(int from, int to) {
               final NowPlayingCursor mNowPlayingCursor = (NowPlayingCursor) YOUR_CURSOR;
                mNowPlayingCursor.moveItem(from, to);
                // Call `notifyDataSetChanged` here.
        }
    };

Вы также должны посмотреть их метод moveQueueItem, используемый для перемещения элемента из одного индекса в другой. Этот метод используется в NowPlayingCursor, когда вызываются onMove и moveItem.

Это можно найти здесь - MediaPlaybackService.java

Итак, есть какая-то работа, которая должна быть выполнена с вашей стороны, но это определенно возможно.

Ответ 3

Вот библиотека, которая, надеюсь, решит вашу проблему, позволяет переупорядочивать элементы списка перетаскивания. Имеет отличную демонстрацию, которая включает в себя варианты использования для Fragments и Cursors

https://github.com/bauerca/drag-sort-listview

Основные возможности:

  • Чистое перетаскивание (без видимых сбоев, надеюсь!).
  • Интуитивная и плавная прокрутка при перетаскивании.
  • Поддержка разнородных высот элементов.
  • Общие методы startDrag() и stopDrag().
  • Открытый интерфейс для настройки плавающего представления.