【发布时间】:2018-07-26 23:35:16
【问题描述】:
我有这个待办事项列表应用程序,其中“任务”可以包含他们自己的“子任务”列表。问题是,每当这些“任务”通过拖放重新排列时,有时会出现奇怪的行为,例如单击它们以显示其子列表时崩溃。
这是拖放监听器的代码:
private void attachItemTouchHelperToAdapter() {
ItemTouchHelper.SimpleCallback touchCallback =
new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
final int fromPosition = viewHolder.getAdapterPosition();
final int toPosition = target.getAdapterPosition();
rearrangeTasks(fromPosition, toPosition);
// Call background thread to update database.
new UpdateDatabaseTask(mTaskList).execute();
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
Task taskToDelete = mTaskAdapter.mTasks.get(position);
TaskLab.get(getActivity()).deleteTask(taskToDelete);
updateUI(position);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(touchCallback);
itemTouchHelper.attachToRecyclerView(mTaskRecyclerView);
}
重新排列在 onMove 中调用的列表的代码:
private void rearrangeTasks(int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(mTaskList, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mTaskList, i, i - 1);
}
}
mTaskAdapter.notifyItemMoved(fromPosition, toPosition);
}
调用更新sqlite数据库的AsyncTask:
private class UpdateDatabaseTask extends AsyncTask<Void, Void, Void> {
private List<Task> mTaskList;
public UpdateDatabaseTask(List<Task> taskList) {
mTaskList = taskList;
}
@Override
protected Void doInBackground(Void... voids) {
TaskLab.get(getActivity()).updateDatabase(mTaskList);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}
调用数据库辅助函数以使用重新排列的列表更新整个表:
public void updateDatabase(List<Task> tasks) {
mDatabase.delete(TaskTable.NAME, null, null);
for (Task task : tasks) {
addTask(task);
}
}
这里的问题是,有时,当快速拖放“任务”时,AsyncTask 更新数据库的速度不够快,因此当我尝试在它完成更新之前对其执行功能时,会出现奇怪的行为。
在 RecyclerView 拖放时更新 SQLite 数据库的更好方法是什么?
【问题讨论】:
标签: java android sqlite android-asynctask background