Вот простой подход для заказа товаров, использующий его с базой данных комнат.
Объект Entity (модель):
Столбец для заказа, введите Integer:
@ColumnInfo(name = "word_order")
private Integer mOrder;
In Dao:
Запрос, который извлекает самый большой порядок в столбце word_order
:
@Query("SELECT MAX(word_order) FROM word_table")
int getLargestOrder();
И запроскоторые обновляют весь список слов:
@Update(onConflict = OnConflictStrategy.REPLACE)
void update(List<WordEntity> wordEntities);
Используется MAX
SQL-команда для получения наибольшего числа.
In Activity (при добавлении нового слова):
Запросить этот метод getLargestOrder()
и добавить +1 к нему, затем создать новое слово.
В Activity (onCreate ()):
Создание ItemTouchHelper
для перемещения элементов слова, используйте только движения ВВЕРХ и ВНИЗ:
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.UP | ItemTouchHelper.DOWN) {
});
Это служебный класс, в который можно добавить пролистывание для отклонения и перетаскивать поддержкуRecyclerView.Он работает с RecyclerView и классом обратного вызова, который определяет, какой тип взаимодействия разрешен, а также получает события, когда пользователь выполняет эти действия.
Переопределите getMovementFlags
внутри него, чтобы указать требуемыйнаправления:
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
0);
}
Переопределить onMove
внутри него, чтобы поменять местами позиции:
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(mWordEntities, i, i + 1);
int order1 = mWordEntities.get(i).getOrder();
int order2 = mWordEntities.get(i + 1).getOrder();
mWordEntities.get(i).setOrder(order2);
mWordEntities.get(i + 1).setOrder(order1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mWordEntities, i, i - 1);
int order1 = mWordEntities.get(i).getOrder();
int order2 = mWordEntities.get(i - 1).getOrder();
mWordEntities.get(i).setOrder(order2);
mWordEntities.get(i - 1).setOrder(order1);
}
}
mAdapter.notifyItemMoved(fromPosition, toPosition);
return true;
}
Этот метод, при котором позиция элементов обновляетсяпри перемещении.
Сначала получите позиции для элементов из адаптера.
Затем, если уменьшите, поменяйте местами объекты с помощьюПередача текущей позиции элемента и новой (для глаз пользователя).
После этого получите заказ на текущий элемент и следующий элемент, поменяйте их и установите их с помощью методов установки(чтобы сохранить их в комнате позже).
С другой стороны, сделать то же самое для приращения.
Завершить, уведомив элементы адаптерапереместился (для глаз пользователя).
Переопределить clearView
для обновления списка объектов Word:
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
mWordViewModel.update(mWordEntities);
}
Этот метод вызывается, когда пользователь удаляет элемент.Будет целесообразно обновить и сохранить сущности в базе данных комнат.
Переопределить onSwiped
:
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
Это должно бытьпереопределить системой.
Присоединить ItemTouchHelper
к RecyclerView:
itemTouchHelper.attachToRecyclerView(mRecyclerView);
Вы можете создать множество ItemTouchHelper и прикрепить их кRecyclerView по мере необходимости.
Остерегайтесь того, что вам нужно упорядочить элементы в RecyclerView от самого большого числа до самого низкого числа.Надеюсь, это поможет вам:)