Android 利用cursor来进行排序

来源:互联网 发布:淘宝上面名龙堂好吗 编辑:程序博客网 时间:2024/06/11 03:22
 主要思路是: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。

[java] view plaincopy
  1. package com.xx.test;  
  2. import java.util.ArrayList;  
  3. import java.util.Collections;  
  4. import java.util.Comparator;  
  5. import android.database.Cursor;  
  6. import android.database.CursorWrapper;  
  7. import com.xx.test.SortCursor.SortEntry;  
  8. public class SortCursor extends CursorWrapper implements Comparator<SortEntry>{  
  9.       
  10.     public SortCursor(Cursor cursor) {  
  11.         super(cursor);  
  12.     }  
  13.       
  14.     Cursor mCursor;  
  15.     ArrayList<SortEntry> sortList = new ArrayList<SortEntry>();  
  16.     int mPos = 0;  
  17.     public static class SortEntry {  
  18.         public String key;  
  19.         public int order;  
  20.     }  
  21.   
  22.     public int compare(SortEntry entry1, SortEntry entry2) {  
  23.         return entry1.key.compareTo(entry2.key);  
  24.     }  
  25.       
  26.     public SortCursor(Cursor cursor, String columnName) {  
  27.         super(cursor);  
  28.           
  29.         mCursor = cursor;  
  30.         if (mCursor != null && mCursor.getCount() > 0) {  
  31.             int i = 0;  
  32.             int column = cursor.getColumnIndexOrThrow(columnName);  
  33.             for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext(), i++) {  
  34.                 SortEntry sortKey = new SortEntry();  
  35.                 sortKey.key = cursor.getString(column);  
  36.                 sortKey.order = i;  
  37.                 sortList.add(sortKey);  
  38.             }  
  39.         }  
  40.         Collections.sort(sortList, this);  
  41.     }  
  42.     public boolean moveToPosition(int position) {  
  43.         if (position >= 0 && position < sortList.size()) {  
  44.             mPos = position;  
  45.             int order = sortList.get(position).order;  
  46.             return mCursor.moveToPosition(order);  
  47.         }  
  48.         if (position < 0) {  
  49.             mPos = -1;  
  50.         }  
  51.         if (position >= sortList.size()) {  
  52.             mPos = sortList.size();  
  53.         }  
  54.         return mCursor.moveToPosition(position);  
  55.     }  
  56.     public boolean moveToFirst() {  
  57.         return moveToPosition(0);  
  58.     }  
  59.     public boolean moveToLast() {  
  60.         return moveToPosition(getCount() - 1);  
  61.     }  
  62.     public boolean moveToNext() {  
  63.         return moveToPosition(mPos + 1);  
  64.     }  
  65.     public boolean moveToPrevious() {  
  66.         return moveToPosition(mPos - 1);  
  67.     }  
  68.     public boolean move(int offset) {  
  69.         return moveToPosition(mPos + offset);  
  70.     }  
  71.     public int getPosition() {  
  72.         return mPos;  
  73.     }  
  74. }