首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将重新排序的RecyclerView保存到SQLite中

将重新排序的RecyclerView保存到SQLite中
EN

Stack Overflow用户
提问于 2016-04-07 11:19:13
回答 2查看 1.8K关注 0票数 6

因此,我试图在我的待办事项列表应用程序中实现Drag-and-Drop,但我很难保存一旦移动的行的顺序--也就是说,我移动了项目,退出了应用程序,它又回到了原来的位置。我想出了一个解决办法。

我的解决方案:

在我的表中创建一个列: specified_position。每次移动一行时,onItemMove()方法都会返回一个fromPositiontoPosition。将行的位置移动到toPosition,然后在那里和上面增加/更新所有值。每次读取该表时,它都会检查这些位置并根据其进行排序。

我的问题:

我的解决方案正确吗?是否有更好、更容易甚至更好的方法来代替?非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-07 11:35:27

我的“做清单”应用程序也有同样的问题。在这里,我和你分享我的解决方案。

首先,我在我的数据库助手上有一个函数

代码语言:javascript
复制
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。

代码语言:javascript
复制
@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
}
票数 3
EN

Stack Overflow用户

发布于 2016-05-24 18:20:12

作为回答的另一种方式@Emin Ayar

ItemTouchHelper.Callback类的clearView方法只调用一次,与onMoveonSwiped方法不完全相同。

onMove和onSwiped被称为多个times...Because,它移动或滑动每个受影响的元素.

但是clearView方法只被调用了一次.

因此,在这种方法中,删除Sqlite上的所有元素并添加新的列表,可以成为另一种解决方案。

代码语言:javascript
复制
 @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);

        db.deleteAllFavoriteNewspapers();

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

拖动和滑动教程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36474658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档