【问题标题】:Save reordered RecyclerView in SQLite在 SQLite 中保存重新排序的 RecyclerView
【发布时间】:2016-04-07 11:19:13
【问题描述】:

所以我试图在我的待办事项列表应用程序中实现Drag-and-Drop,但我无法保存移动后的行顺序 - 即我移动了项目,退出了应用程序并恢复到原来的状态位置。我想到了一个解决方案。

我的解决方案:

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

我的问题:

我的解决方案正确吗?有没有更好、更简单的方法来代替呢?非常感谢!

【问题讨论】:

标签: android sqlite android-recyclerview


【解决方案1】:

我的 To Do List 应用也遇到了同样的问题。在这里和大家分享一下我的解决方案。

首先我的Database Helper

上有一个updateSortID()函数
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
}

【讨论】:

  • 您的解决方案可以适用,但您必须保留 sortId 的最新位置,因为它可以通过拖动和滑动来更改
  • @EminAyar ITEM_SORT_ID 是什么,我可以将它用于 RecyclerViewItemTouchHelper 和方法 onMove 吗?
  • @Ucdemir 我应用了这个,但有时它不起作用,stackoverflow.com/questions/62665019/…
【解决方案2】:

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

ItemTouchHelper.Callback 类的

clearView 方法只调用一次,与 onMoveonSwiped 方法不完全相同...

onMoveonSwiped 被多次调用...因为它移动或滑动每个受影响的元素...

但是 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

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多