Loader<Cursor> 仅加载所选行 + 下一行
Loader<Cursor> load only selected row + next row
在 activity A 中,我正在加载一个列表,其中包含我的 table 中的所有值,并设置了一个 setOnItemClickListener 以启动 activity B 并通过发送数据
[1]
Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);
在 activity B 我有我的 onCreateLoader 和投影:
String[] projection = {
TestEntry._ID,
TestEntry.COLUMN_TEST_ONE,
TestEntry.COLUMN_TEST_TWO}
...使用 return 语句
return new CursorLoader(this,
mCurrentTestUri, //Got this from Activity A
projection,
null,
null,
null);
我的 onLoadFinished 看起来像这样:
if (cursor.moveToFirst()) {
int oneColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
int twoColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_TWO);
String currentOne = cursor.getString(oneColumnIndex);
String currentTwo = cursor.getString(twoColumnIndex);
textViewOne.setText(currentOne);
textViewTwo.setText(currentTwo);
}
到目前为止一切顺利,现在我希望显示下一行(就在它的正下方)的值,但使用不同的投影(我只需要 _ID
和 COLUMN_TEST_ONE
)并具有 onLoadFinished 在 textViewThree
.
中显示 COLUMN_TEST_ONE 的值
[values from both rows should be shown at the same time, not one or
another]
我可以使用 [2] 从 activity A 获取下一行的 ID,并将其作为通过 putExtra 的字符串,但这就是我到目前为止所拥有的。
[2]
String nextItemId = String.valueOf(listView.getItemIdAtPosition(position + 1));
if((position+1) < lListView.getCount()) {
intent.putExtra("prevID", nextItemId);
}
..或者我可以使用下一行 ID 创建一个有效的 URI 路径,并将其作为字符串从 Activity A 发送,并在需要时将其转换为 activity B 中的 URI:
ContentUris.withAppendedId(TestEntry.CONTENT_URI, nextItemId)
How should I change my activity B to load values from the next row
and the current one onCreate?
问题出在您的查询上:
Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);
您在此处指定,您想要查询 仅 行,这些行具有特定的 id
。任何具有不同 id
的行都不会在 Cursor
.
中返回
相反,使用适当的选择参数查询 table:
// Load all rows that have id `firstId` or `secondId`
return new CursorLoader(this,
TestEntry.CONTENT_URI,
projection,
TestEntry._ID + "=? OR " + TestEntry._ID + "=?",
new String[] {firstId, secondId},
null);
然后你可以通过以下方式获取secondId
行的值:
if (cursor.moveToFirst()) {
...
textViewOne.setText(currentOne);
textViewTwo.setText(currentTwo);
if (cursor.moveToNext()) {
int index = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
String next = cursor.getString(index);
// Use `next` as needed, may be passed to next activity via extras
}
}
在 activity A 中,我正在加载一个列表,其中包含我的 table 中的所有值,并设置了一个 setOnItemClickListener 以启动 activity B 并通过发送数据
[1]
Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);
在 activity B 我有我的 onCreateLoader 和投影:
String[] projection = {
TestEntry._ID,
TestEntry.COLUMN_TEST_ONE,
TestEntry.COLUMN_TEST_TWO}
...使用 return 语句
return new CursorLoader(this,
mCurrentTestUri, //Got this from Activity A
projection,
null,
null,
null);
我的 onLoadFinished 看起来像这样:
if (cursor.moveToFirst()) {
int oneColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
int twoColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_TWO);
String currentOne = cursor.getString(oneColumnIndex);
String currentTwo = cursor.getString(twoColumnIndex);
textViewOne.setText(currentOne);
textViewTwo.setText(currentTwo);
}
到目前为止一切顺利,现在我希望显示下一行(就在它的正下方)的值,但使用不同的投影(我只需要 _ID
和 COLUMN_TEST_ONE
)并具有 onLoadFinished 在 textViewThree
.
[values from both rows should be shown at the same time, not one or another]
我可以使用 [2] 从 activity A 获取下一行的 ID,并将其作为通过 putExtra 的字符串,但这就是我到目前为止所拥有的。
[2]
String nextItemId = String.valueOf(listView.getItemIdAtPosition(position + 1));
if((position+1) < lListView.getCount()) {
intent.putExtra("prevID", nextItemId);
}
..或者我可以使用下一行 ID 创建一个有效的 URI 路径,并将其作为字符串从 Activity A 发送,并在需要时将其转换为 activity B 中的 URI:
ContentUris.withAppendedId(TestEntry.CONTENT_URI, nextItemId)
How should I change my activity B to load values from the next row and the current one onCreate?
问题出在您的查询上:
Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);
您在此处指定,您想要查询 仅 行,这些行具有特定的 id
。任何具有不同 id
的行都不会在 Cursor
.
相反,使用适当的选择参数查询 table:
// Load all rows that have id `firstId` or `secondId`
return new CursorLoader(this,
TestEntry.CONTENT_URI,
projection,
TestEntry._ID + "=? OR " + TestEntry._ID + "=?",
new String[] {firstId, secondId},
null);
然后你可以通过以下方式获取secondId
行的值:
if (cursor.moveToFirst()) {
...
textViewOne.setText(currentOne);
textViewTwo.setText(currentTwo);
if (cursor.moveToNext()) {
int index = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
String next = cursor.getString(index);
// Use `next` as needed, may be passed to next activity via extras
}
}