因此,我试图在我的待办事项列表应用程序中实现Drag-and-Drop,但我很难保存一旦移动的行的顺序--也就是说,我移动了项目,退出了应用程序,它又回到了原来的位置。我想出了一个解决办法。
我的解决方案:
在我的表中创建一个列: specified_position。每次移动一行时,onItemMove()方法都会返回一个fromPosition和toPosition。将行的位置移动到toPosition,然后在那里和上面增加/更新所有值。每次读取该表时,它都会检查这些位置并根据其进行排序。
我的问题:
我的解决方案正确吗?是否有更好、更容易甚至更好的方法来代替?非常感谢!
发布于 2016-04-07 11:35:27
我的“做清单”应用程序也有同样的问题。在这里,我和你分享我的解决方案。
首先,我在我的数据库助手上有一个函数
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);
}然后,在活动或适配器上,您应该侦听项的位置变化,您需要有这样的函数。它将更新所有受此位置影响的项目的所有排序ID。
@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
}发布于 2016-05-24 18:20:12
作为回答的另一种方式@Emin Ayar
ItemTouchHelper.Callback类的clearView方法只调用一次,与onMove和onSwiped方法不完全相同。
onMove和onSwiped被称为多个times...Because,它移动或滑动每个受影响的元素.
但是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);
}
}https://stackoverflow.com/questions/36474658
复制相似问题