gpt4 book ai didi

android - 使用 Itemtouchhelper 更改房间数据库的顺序

转载 作者:行者123 更新时间:2023-12-04 23:51:07 27 4
gpt4 key购买 nike

我有一个使用 recyclerview 来显示数据库项目的应用程序。我想通过使用 itemtouchhelper 拖动来重新排列项目。我想出了如何做到这一点,但我不知道如何更新我的房间数据库。

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT|ItemTouchHelper.DOWN|ItemTouchHelper.UP, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

int dragFrom = -1;
int dragTo = -1;
boolean listChanged = false;

@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
int from = viewHolder.getAdapterPosition();
int to = viewHolder1.getAdapterPosition();

if(dragFrom == -1) {
dragFrom = from;
}
dragTo = to;
listChanged = true;

Collections.swap(mGames, from, to);
gameAdapter.notifyItemMoved(from, to);

return true;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
mGames.remove(viewHolder.getAdapterPosition());
Game game = mGames.get(viewHolder.getAdapterPosition());
mGameViewModel.deleteGame(game);
gameAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}

@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);

if(actionState == ItemTouchHelper.ACTION_STATE_IDLE && listChanged){

//update database

listChanged = false;
}
}
});

比如我把第 3 项拖到第 6 点,然后第 4 项变成第 3 项,第 5 项变成 4,第 6 项变成 5。

有没有一种特殊的方法,或者我必须自己找到一个?

最佳答案

一种简单的方法(但对于大型列表效率低下)是,一旦您获得新列表,清除数据库并重新插入项目(使用新的 id (PKeys))。还要确保仅在用户停止拖动时才进行数据库操作。还要确保您没有以任何特定顺序从数据库中查询项目。

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

boolean drag = false;

@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
int position_dragged = viewHolder.getAdapterPosition();
int position_target = target.getAdapterPosition();

Collections.swap(mAdapter.getTasks(), position_dragged, position_target);
mAdapter.notifyItemMoved(position_dragged, position_target);

return false;
}

@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);

if(actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
drag = true;
}

if(actionState == ItemTouchHelper.ACTION_STATE_IDLE && drag) {
Log.d("DragTest","DRAGGGING stop");
drag= false;

final List<TaskEntry> NewTasksList = mAdapter.getTasks();

AppExecutors.getInstance().diskIO().execute(new Runnable() {
@Override
public void run() {
mDb.taskDao().deleteAll();

for(int i =0; i < NewTasksList.size(); i++){
TaskEntry task = NewTasksList.get(i);
mDb.taskDao().insertTask(new TaskEntry(
task.getDescription(),
task.getPriority(),
task.getUpdatedAt(),
task.isChecked()
));
}
}
});
}
}
}).attachToRecyclerView(mRecyclerView);
默认情况下,Sqlite 按 primaryKey 的 ASC 顺序返回(在我的例子中是 ids)。因此,请确保不要插入具有旧 ID 的新项目。
我的TaskEntry.java

@Entity(tableName = "task")
public class TaskEntry {

@PrimaryKey(autoGenerate = true)
private int id;
private String description;
private int priority;
@ColumnInfo(name = "updated_at")
private Date updatedAt;
private boolean checked;

//When adding new entry to database, id is automatically generated
@Ignore
public TaskEntry(String description, int priority, Date updatedAt, boolean checked) {
this.description = description;
this.priority = priority;
this.updatedAt = updatedAt;
this.checked = checked;
}

//when reading from database
public TaskEntry(int id, String description, int priority, Date updatedAt, boolean checked) {
this.id = id;
this.description = description;
this.priority = priority;
this.updatedAt = updatedAt;
this.checked = checked;
}

我的TaskDao.java
@Dao
public interface TaskDao{

//
@Query("SELECT * FROM task")
LiveData<List<TaskEntry>> loadAllTasks();

@Insert
void insertTask(TaskEntry taskEntry);

@Update(onConflict = OnConflictStrategy.REPLACE)
void updateTask(TaskEntry taskEntry);

@Delete
void deleteTask(TaskEntry taskEntry);

@Query("DELETE FROM task")
void deleteAll();

@Query("SELECT * FROM task WHERE id = :id")
LiveData<TaskEntry> loadTaskById(int id);
}

关于android - 使用 Itemtouchhelper 更改房间数据库的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com