Несовпадение позиций в адаптере и базе данных после удаления элемента

Рейтинг: 0Ответов: 1Опубликовано: 10.07.2023

Использую RecyclerView адаптер и базу данных SQLite. Реализовано перетаскивание (сортировка) элементов при помощи onMove. Проблема заключается в том, что после удаления одного из элементов, перетаскивание работает неверно, в базу записываются неверные значения. Предполагаю, что проблема заключается в несовпадении позиций в адаптере и базе данных. В базе после удаления элемента, _id имеет, например, такой порядок: 1, 2, 4, 5. В адаптере, скорее всего: 0, 1, 2, 3. При сортировке и обновлении в базе добавляю к toPosition и fromPosition + 1 для выравнивания позиций. Как выровнять эти позиции после удаления одного из элементов? Какое может быть решение этой проблемы?

AdapterSmetaFull.java

@Override
public void onRowMoved(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(mPeopleList, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(mPeopleList, i, i - 1);
        }
    }
    notifyItemMoved(fromPosition, toPosition);

    String vd_rabot_from = mPeopleList.get(fromPosition).getVd_rabot();
    String kol_from = mPeopleList.get(fromPosition).getKol();
    String zena_from = mPeopleList.get(fromPosition).getZena();
    String valuta_from = mPeopleList.get(fromPosition).getValuta();
    String slog_from = mPeopleList.get(fromPosition).getSlog();

    String vd_rabot_to = mPeopleList.get(toPosition).getVd_rabot();
    String kol_to = mPeopleList.get(toPosition).getKol();
    String zena_to = mPeopleList.get(toPosition).getZena();
    String valuta_to = mPeopleList.get(toPosition).getValuta();
    String slog_to = mPeopleList.get(toPosition).getSlog();

    // updating Swap
    final DatabaseAccessSmeta databaseAccessSmeta = DatabaseAccessSmeta.getInstance(mContext);
    databaseAccessSmeta.open();
    DatabaseAccessSmeta db = new DatabaseAccessSmeta(mContext);

    PersonSmetaUpdate fromUpdatedPerson = new PersonSmetaUpdate(vd_rabot_from, kol_from, zena_from, valuta_from, slog_from);
    PersonSmetaUpdate toUpdatedPerson = new PersonSmetaUpdate(vd_rabot_to, kol_to, zena_to, valuta_to, slog_to);

    db.updateSwap(toPosition, toUpdatedPerson, smeta_ident);
    db.updateSwap(fromPosition, fromUpdatedPerson, smeta_ident);

    db.close();
}

DatabaseAccessSmeta.java

public void updateSwap(long swap, PersonSmetaUpdate updatedperson, String smeta_ident) {
    swap = swap + 1;
    this.database = openHelper.getWritableDatabase();
    database.execSQL("UPDATE " +smeta_ident+ " SET vd_rabot ='"+ updatedperson.getVd_rabot() + "', kol ='" + updatedperson.getKol()+ "', zena ='"+ updatedperson.getZena() + "', valuta ='"+ updatedperson.getValuta() + "', slog ='"+ updatedperson.getSlog() + "'  WHERE _id='" + swap + "'");
    database.close();
}

Ответы

▲ 1Принят

Вы должны в метод updateSwap() передать не позицию из адаптера, а id из базы.
Соответственно id должен быть включен в выборку и помещён в модель.

@Override
public void onRowMoved(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(mPeopleList, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(mPeopleList, i, i - 1);
        }
    }
    notifyItemMoved(fromPosition, toPosition);

    String vd_rabot_from = mPeopleList.get(fromPosition).getVd_rabot();
    String kol_from = mPeopleList.get(fromPosition).getKol();
    String zena_from = mPeopleList.get(fromPosition).getZena();
    String valuta_from = mPeopleList.get(fromPosition).getValuta();
    String slog_from = mPeopleList.get(fromPosition).getSlog();
    long id_from = mPeopleList.get(fromPosition).getId();

    String vd_rabot_to = mPeopleList.get(toPosition).getVd_rabot();
    String kol_to = mPeopleList.get(toPosition).getKol();
    String zena_to = mPeopleList.get(toPosition).getZena();
    String valuta_to = mPeopleList.get(toPosition).getValuta();
    String slog_to = mPeopleList.get(toPosition).getSlog();
    long id_to = mPeopleList.get(toPosition).getId();

    // swap ids in model
    mPeopleList.get(fromPosition).setId(id_to);
    mPeopleList.get(toPosition).setId(id_from);

    // updating Swap
    final DatabaseAccessSmeta databaseAccessSmeta = DatabaseAccessSmeta.getInstance(mContext);
    databaseAccessSmeta.open();
    DatabaseAccessSmeta db = new DatabaseAccessSmeta(mContext);

    PersonSmetaUpdate fromUpdatedPerson = new PersonSmetaUpdate(vd_rabot_from, kol_from, zena_from, valuta_from, slog_from);
    PersonSmetaUpdate toUpdatedPerson = new PersonSmetaUpdate(vd_rabot_to, kol_to, zena_to, valuta_to, slog_to);

    db.updateSwap(id_to, toUpdatedPerson, smeta_ident);
    db.updateSwap(id_from, fromUpdatedPerson, smeta_ident);

    db.close();