接受的答案让我开始回答这个问题,但它包含几个小错误。
case LEFT:
// handle case where a row in cursorA is unique
// images is unique (missing thumbnail)
case RIGHT:
// handle case where a row in cursorB is unique
// thumbs is unique (missing image)
这些是倒退的。文档自相矛盾,很可能是错误发生的地方。来自source code of CursorJoiner:
case LEFT:
// handle case where a row in cursorA is unique
然后在源代码的 Result 的枚举中:
public enum Result {
/** The row currently pointed to by the left cursor is unique */
RIGHT,
/** The row currently pointed to by the right cursor is unique */
LEFT,
/** The rows pointed to by both cursors are the same */
BOTH
}
所以我猜这就是你强制增加光标的原因。
//compensate for CursorJoiner expecting cursors ordered ascending...
c_images.moveToNext();
c_thumbs.moveToPrevious();
CursorJoiner 中的迭代器会自动为您增加游标。
这应该是工作代码(此代码还将内部存储和外部存储合并到一个游标中):
Cursor[] thumbs = new Cursor[2];
thumbs[0] = mActivity.getContentResolver().query(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Thumbnails._ID ,
MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.DATA
},
null,
null,
MediaStore.Images.Thumbnails.IMAGE_ID + "*(-1)"
);
thumbs[1] = mActivity.getContentResolver().query(
MediaStore.Images.Thumbnails.INTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Thumbnails._ID ,
MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.DATA
},
null,
null,
MediaStore.Images.Thumbnails.IMAGE_ID + "*(-1)"
);
Cursor thumbCursor = new MergeCursor(thumbs);
Cursor[] cursors = new Cursor[2];
cursors[0] = mActivity.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE
},
null,
null,
MediaStore.Images.Media._ID + "*(-1)"
);
cursors[1] = mActivity.getContentResolver().query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE
},
null,
null,
MediaStore.Images.Media._ID + "*(-1)"
);
Cursor photoCursor = new MergeCursor(cursors);
CursorJoiner cursorJoiner = new CursorJoiner(
thumbCursor,
new String[]{
MediaStore.Images.Thumbnails.IMAGE_ID
},
photoCursor,
new String[]{
MediaStore.Images.Media._ID,
}
);
Cursor finalCursor= new MatrixCursor(new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE,
"thumb_data"
});
for (CursorJoiner.Result joinerResult : cursorJoiner) {
switch (joinerResult) {
case RIGHT:
finalCursor.addRow(new Object[]{
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media._ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.DATA)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE)),
null
});
break;
case BOTH:
finalCursor.addRow(new Object[]{
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media._ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.DATA)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE)),
thumbCursor.getString(thumbCursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA)),
});
break;
}
}
photoCursor.close();
thumbCursor.close();