Обновление onMove () изменений в представлении данных переработчика в базу данных помещения - PullRequest
2 голосов
/ 02 мая 2019

После некоторых статей я пытаюсь создать приложение для Android со следующим:

  • A recyclerview, который выбирает данные из базы данных комнаты, используя живые данные.
  • Структура данных - это список пользовательских объектов с атрибутом для упорядочения данных.

Особенности в обзоре переработчика:

  • Перетаскивание для изменения порядка данных
  • Проведите пальцем, чтобы удалить
  • Отменить действие для удаления пальца

Рекомендуемые статьи:

  1. Google кодовые метки для базы данных и данных в реальном времени
  2. AndroidHive статья для повторного просмотра просмотр, чтобы удалить и отменить, чтобы восстановить удаленный элемент
  3. Средний пост Пола Бёрка для перетаскивания в режиме рециркуляции
  4. Средний пост Пола Бёрка для настройки перетаскиваемого элемента в режиме рециркуляции SO Post для обнаружения сбрасывания в представлении переработчика

Моя проблема:
Переупорядочение данных не обновляется в библиотеке помещения.

Примечание:
Я использую атрибут для упорядочивания данных

Пожалуйста, обратитесь к этому репозиторию GitHub , если вам нужна дополнительная информация о реализации. Я создал пример приложения для этого вопроса.
( Добавление полного кода, о котором идет речь, кажется слишком длинным, пожалуйста, обратитесь к моему репозиторию github за кодом )

Пожалуйста, оставьте комментарий, если требуется код определенного файла. Я не уверен, какой код отправлять.

MainFragment.java (Код для изменения порядка данных, который не работает)

// To handle recycler view item dragging
@Override
public void onItemMove(int fromPosition, int toPosition) {

    // Log
    Log.e(TAG, "Item moved from " + fromPosition + " to " + toPosition);

    // Move the item within the recycler view
    mainRecyclerViewAdapter.moveItem(fromPosition, toPosition);
}

// To handle recycler view item drop
@Override
public void onItemDragged(int fromPosition, int toPosition) {

    // Log
    Log.e(TAG, "Item dragged from " + fromPosition + " to " + toPosition);

    mainActivityViewModel.moveWord(fromPosition, toPosition);
}

MainActivityViewModel.java

public void moveWord(int fromPosition, int toPosition) {

    // Move word
    wordRepository.move(fromPosition, toPosition);
}

WordRepository.java

public void move(int from, int to) {
    new moveAsyncTask(wordDao).execute(from, to);
}

// Async update task
private static class moveAsyncTask extends AsyncTask<Integer, Void, Void> {


    // Dao
    private WordDao asyncTaskDao;


    // Constructor
    moveAsyncTask(WordDao wordDao) {

        // Get dao
        asyncTaskDao = wordDao;
    }


    @Override
    protected Void doInBackground(final Integer... params) {

        int from = params[0];
        int to = params[1];

        if (from > to) {

            // Move upwards

            asyncTaskDao.getAllWordsBetween(to, from - 1).forEach(wordToUpdate -> {

                // Update word number
                wordToUpdate.decreaseSNo();

                // Update word in database
                update(wordToUpdate);
            });

            asyncTaskDao.getWordWithNo(from).forEach(wordToUpdate -> {

                // Update word number
                wordToUpdate.setSno(to);

                // Update word in database
                update(wordToUpdate);
            });

        } else {

            // Move downwards

            asyncTaskDao.getAllWordsBetween(from + 1, to).forEach(wordToUpdate -> {

                // Update word number
                wordToUpdate.increaseSNo();

                // Update word in database
                update(wordToUpdate);
            });

            asyncTaskDao.getWordWithNo(from).forEach(wordToUpdate -> {

                // Update word number
                wordToUpdate.setSno(to);

                // Update word in database
                update(wordToUpdate);
            });

        }

        return null;
    }
}

WordDao.java

@Query("SELECT * FROM words WHERE sno >= :low AND sno <= :high")
List<Word> getAllWordsBetween(int low, int high);

@Query("SELECT * FROM words WHERE sno == :sNo")
List<Word> getWordWithNo(int sNo);

1 Ответ

1 голос
/ 04 мая 2019

Вот простой подход для заказа товаров, использующий его с базой данных комнат.

Объект 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 от самого большого числа до самого низкого числа.Надеюсь, это поможет вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...