【发布时间】:2019-09-20 19:17:32
【问题描述】:
根据一些文章,我正在尝试使用以下内容创建一个 android 应用程序:
-
recyclerview使用实时数据从房间数据库中获取数据。 - 数据结构是自定义对象的列表,具有用于对数据进行排序的属性。
recyclerview 中的功能:
- 拖放以重新排序数据
- 滑动删除
- 取消滑动删除操作
推荐文章:
- Google codelabs for room database and live data
- AndroidHive article for recyclerview swipe to delete and undo to restore deleted item
- Medium post by Paul Burke for drag/drop in recycler view
- Medium post by Paul Burke for customizing dragged item in recycler view
- SO Post to detect drop event in recycler view
我的问题:
房间库中的数据重新排序不会更新。
注意:
我正在使用属性进行数据排序
如果需要特定文件的代码,请发表评论。我不确定要发布哪个代码。
MainFragment.java(重新排序数据的代码,不起作用)
// To handle recycler view item dragging
@Override
public void onItemMove(int fromPosition, int toPosition) {
// Log
Log.e(TAG, "Item moved from " + fromPosition + " to " + toPosition);
// Move the item within the recycler view
mainRecyclerViewAdapter.moveItem(fromPosition, toPosition);
}
// To handle recycler view item drop
@Override
public void onItemDragged(int fromPosition, int toPosition) {
// Log
Log.e(TAG, "Item dragged from " + fromPosition + " to " + toPosition);
mainActivityViewModel.moveWord(fromPosition, toPosition);
}
MainActivityViewModel.java
public void moveWord(int fromPosition, int toPosition) {
// Move word
wordRepository.move(fromPosition, toPosition);
}
WordRepository.java
public void move(int from, int to) {
new moveAsyncTask(wordDao).execute(from, to);
}
// Async update task
private static class moveAsyncTask extends AsyncTask<Integer, Void, Void> {
// Dao
private WordDao asyncTaskDao;
// Constructor
moveAsyncTask(WordDao wordDao) {
// Get dao
asyncTaskDao = wordDao;
}
@Override
protected Void doInBackground(final Integer... params) {
int from = params[0];
int to = params[1];
if (from > to) {
// Move upwards
asyncTaskDao.getAllWordsBetween(to, from - 1).forEach(wordToUpdate -> {
// Update word number
wordToUpdate.decreaseSNo();
// Update word in database
update(wordToUpdate);
});
asyncTaskDao.getWordWithNo(from).forEach(wordToUpdate -> {
// Update word number
wordToUpdate.setSno(to);
// Update word in database
update(wordToUpdate);
});
} else {
// Move downwards
asyncTaskDao.getAllWordsBetween(from + 1, to).forEach(wordToUpdate -> {
// Update word number
wordToUpdate.increaseSNo();
// Update word in database
update(wordToUpdate);
});
asyncTaskDao.getWordWithNo(from).forEach(wordToUpdate -> {
// Update word number
wordToUpdate.setSno(to);
// Update word in database
update(wordToUpdate);
});
}
return null;
}
}
WordDao.java
@Query("SELECT * FROM words WHERE sno >= :low AND sno <= :high")
List<Word> getAllWordsBetween(int low, int high);
@Query("SELECT * FROM words WHERE sno == :sNo")
List<Word> getWordWithNo(int sNo);
【问题讨论】:
-
你能发布你的完整代码示例吗? Github 链接失效。
-
@blueware,这个问题是在一年前发布的,此后由于进行了很多更改,因此该回购已被私有化。接受的答案解决了我的问题。谢谢。
标签: android android-recyclerview drag-and-drop android-room