主要思路是:override move系列的方法,让cursor以自己想要的顺序来移动,从而达到对cursor排序的目的。比如数组A0里有 4(0),3(1),1(2),2(3),括号内为位置,排序后用数据记录A1:1(2),2(3),3(1),4(0)。要访问第一个元素,则访问A1[0]得到1(2),根据(2)找到在A0中的实际位置2,即1(2)。参考了下系统的CursorWrapper和AbstractCursor代码实现,另外有时间可以顺带了解下MatrixCursor。
- package com.xx.test;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import android.database.Cursor;
- import android.database.CursorWrapper;
- import com.xx.test.SortCursor.SortEntry;
- public class SortCursor extends CursorWrapper implements Comparator<SortEntry>{
- public SortCursor(Cursor cursor) {
- super(cursor);
- }
- Cursor mCursor;
- ArrayList<SortEntry> sortList = new ArrayList<SortEntry>();
- int mPos = 0;
- public static class SortEntry {
- public String key;
- public int order;
- }
- public int compare(SortEntry entry1, SortEntry entry2) {
- return entry1.key.compareTo(entry2.key);
- }
- public SortCursor(Cursor cursor, String columnName) {
- super(cursor);
- mCursor = cursor;
- if (mCursor != null && mCursor.getCount() > 0) {
- int i = 0;
- int column = cursor.getColumnIndexOrThrow(columnName);
- for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext(), i++) {
- SortEntry sortKey = new SortEntry();
- sortKey.key = cursor.getString(column);
- sortKey.order = i;
- sortList.add(sortKey);
- }
- }
- Collections.sort(sortList, this);
- }
- public boolean moveToPosition(int position) {
- if (position >= 0 && position < sortList.size()) {
- mPos = position;
- int order = sortList.get(position).order;
- return mCursor.moveToPosition(order);
- }
- if (position < 0) {
- mPos = -1;
- }
- if (position >= sortList.size()) {
- mPos = sortList.size();
- }
- return mCursor.moveToPosition(position);
- }
- public boolean moveToFirst() {
- return moveToPosition(0);
- }
- public boolean moveToLast() {
- return moveToPosition(getCount() - 1);
- }
- public boolean moveToNext() {
- return moveToPosition(mPos + 1);
- }
- public boolean moveToPrevious() {
- return moveToPosition(mPos - 1);
- }
- public boolean move(int offset) {
- return moveToPosition(mPos + offset);
- }
- public int getPosition() {
- return mPos;
- }
- }