如何让Loader<Cursor>仅加载选中行及下一行?含Activity传参场景
实现Loader加载选中行及下一行的方案
要实现这个需求,我们需要调整CursorLoader的查询逻辑——不再局限于查询单条数据,而是基于选中项的ID筛选出当前行和下一行数据。下面是具体的实现步骤:
1. 解析选中项的ID
首先从传入的mCurrentTestUri中提取出选中行的唯一ID:
long selectedId = ContentUris.parseId(mCurrentTestUri);
2. 构建多数据查询条件
我们需要放弃单条数据的Uri,改用表的根CONTENT_URI来查询多条数据,同时通过selection和selectionArgs指定要加载的目标行:
// 筛选规则:匹配选中ID 或 选中ID+1的行 String selection = TestEntry._ID + " = ? OR " + TestEntry._ID + " = ?"; String[] selectionArgs = new String[]{ String.valueOf(selectedId), String.valueOf(selectedId + 1) };
注:如果你的数据列表不是按
_ID连续排序(比如存在删除操作导致ID断档),或者列表是按其他字段排序的,那需要调整筛选逻辑——比如先查询当前行的排序字段值,再查询该字段值之后的第一条数据。但从你的场景描述来看,默认按_ID处理是最直接的方案。
3. 重构CursorLoader实例
最后在onCreateLoader中返回新的CursorLoader,确保排序规则和Activity A的列表一致(这里按_ID升序,保证当前行在前、下一行在后):
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String[] projection = { TestEntry._ID, TestEntry.COLUMN_TEST_ONE, TestEntry.COLUMN_TEST_TWO }; long selectedId = ContentUris.parseId(mCurrentTestUri); String selection = TestEntry._ID + " = ? OR " + TestEntry._ID + " = ?"; String[] selectionArgs = new String[]{ String.valueOf(selectedId), String.valueOf(selectedId + 1) }; return new CursorLoader( this, TestEntry.CONTENT_URI, // 使用表的根Uri,而非单条数据Uri projection, selection, selectionArgs, TestEntry._ID + " ASC" // 保持和Activity A列表一致的排序 ); }
额外注意事项
- 如果选中行是数据库的最后一行,Cursor只会返回当前行,这属于合理情况(没有下一行可加载)。
- 后续在
onLoadFinished中处理Cursor时,记得先判断Cursor的行数,避免出现越界异常。
内容的提问来源于stack exchange,提问作者Alin
相关产品推荐
相关产品推荐

