2016-04-07 2 views
3

Итак, я пытаюсь реализовать Drag-and-Drop в моем приложении «Список дел», но мне не удается сохранить порядок строк после перемещения - т.е. я переместил элементы, вышел из приложения и вернулся обратно к его первоначальному положению. Я думал о решении.Сохранить reorderler RecyclerView в SQLite

Мое решение:

Создать колонку в моей таблице: specified_position. Каждый раз, когда строка перемещается, метод onItemMove() возвращает fromPosition и toPosition. Переместите позицию строки в toPosition, затем добавьте/обновите все значения там и выше. Каждый раз, когда таблица читается, она проверяет позиции и заказывает их в соответствии с ней.

Мой вопрос:

Является ли мое решение правильно? Есть ли лучший, более простой метод вместо этого? Большое спасибо!

ответ

2

У меня была такая же проблема в моем списке дел. Здесь я разделяю ваше решение с вами.

Во-первых у меня есть updateSortID() функцию на моей Database Helper

public void updateSortID(Integer newID,int rowid) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
     String strSQL = "UPDATE " + TABLE_NAME_todos + " SET " + ITEM_SORT_ID + "=" + newID + " WHERE " + ID +" = "+ rowid; 

     db.execSQL(strSQL); 
} 

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

@Override 
public void drop(int from, int to) { 
    // TODO Auto-generated method stub 

    Log.d("drop", String.valueOf(from)); 
    Log.d("drop", String.valueOf(to)); 

    ArrayList<Items> temp = db.getToDos(); 

    int tempstart = from; 
    int tempend = to; 

    if (from < to) { 
     Log.d("up to down", "yes"); 
     db.updateSortID(temp.get(tempend).getSortID(), temp.get(tempstart).getID()); 
     for (int i = from; i <= to - 1; i++) { 
      db.updateSortID(temp.get(i).getSortID(), temp.get(i+1).getID()); 
     } 
    } else if (from > to) { 
     Log.d("up to down", "no"); 
     db.updateSortID(temp.get(tempend).getSortID(), temp.get(tempstart).getID());    
     for (int i = from; i >= to + 1; i--) { 
      db.updateSortID(temp.get(i).getSortID(), temp.get(i-1).getID());     
     } 
    } 

    listChanged(); // this is the method I call `notifyDataSetChanged()` method and other related functions 
} 
+0

Ваше решение может быть применимо, но вы должны держать последнюю позицию sortId, так как она может быть изменяемым с помощью Drag & Размах – Beyaz

0

Как альтернативный способ ответа @Emin Ayar

ClearView метод ItemTouchHelper.Callback класса вызывается только один раз не совсем то же самое с OnMove и onSwiped методы ...

onMove и onSwiped are называемые несколько раз ... Из-за это перемещение или красть каждые элементы, которые влияют ...

Но ClearView метода вызываются только один раз ...

так что в этом методе, удалять каждые элементы на Sqlite и добавить новый список, может быть другое решение ...

@Override 
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
     super.clearView(recyclerView, viewHolder); 

     db.deleteAllFavoriteNewspapers(); 

     for(NewspaperClass nc : mAdapter.list){ 
      db.insertToFavoriteNewspapers(nc); 
     } 
    } 

Tutorial for Drag & Swipe

Смежные вопросы