You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:10:30