我正在使用回收站视图来显示带有过滤器,排序等的表格内容。当添加新项目时,我插入新项目,使用带有排序的SELECT查询新游标的数据库。
在recycleler视图中,我建议在那种情况下调用notifyItemInserted(int position),并在新项目的游标中使用位置含义位置。
我知道有两件事我可以做:
迭代光标并找到项目的位置(如果我的桌子丢失了行,女巫可能不是最好的主意)
不要notifyItemInserted,而是notifyDataSetChanged并且没有漂亮的动画(就像野蛮人一样)
我的问题是是否可以执行一个类似这样的SQL查询:
查询我想要的内容
添加枚举上一个查询结果的COLUMN_POSITION(在内存中)
使用选择COLUMN_POSITION查询上述内容,其中id =新项目的ID。
获取位置
奖金问题:这个问题还有其他解决办法吗?如何找到我在光标中知道的新项目的位置?
答案 0 :(得分:0)
对SQLite的insert
或update
的调用按文档返回
* @return the row ID of the newly inserted row, or -1 if an error occurred
所以你只需要退回来,你就会知道你的行,并且可以使用notifyItemInserted
答案 1 :(得分:0)
我终于得出结论,这个想法是不必要的复杂,实际上迭代光标已经足够了。
CursorJoiner在内部,但比较游标的限制性更强的行为。如果您想使用降序或没有唯一列,则行为未定义,因此您运气不佳。
/**
* @return position of new item or -1 if item could not be found inside the cursor
*/
private int getNewItemPosition(@NonNull Cursor cursor, @NonNull Tag dao) {
int idColumn = cursor.getColumnIndexOrThrow(TagDao.Properties.Id.columnName);
long newDaoId = dao.getId();
while (cursor.moveToNext()) {
if (newDaoId == cursor.getLong(idColumn)) {
return cursor.getPosition();
}
}
return -1;
}
我对性能的初步反对意见并未证明至少在Android应用程序正在使用的规模上是有效的,并且明智的主人说除非测试显示出问题,否则不会优化某些内容。