转自http://jamking.iteye.com/blog/1019303
android下面需要对数据库某列的内容,按照中文拼音的顺序来排序。
baidu了下,发现常见的方式是要在数据库增加一列来存放拼音,专门用该列来排序,比如联系人就是用此方式实现的。
换google,发现有邮件中说,可以实现CursorWrapper,来达到排序功能。
具体看 How to do sorting on cursor?
http://groups.google.com/group/android-developers/browse_thread/thread/f1fc3e0fc87a3fc6
主要思路是: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
直接上代码
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import android.database.Cursor;
import android.database.CursorWrapper;
public class SortCursor extends CursorWrapper{
Cursor mCursor;
ArrayList<SortEntry> sortList = new ArrayList<SortEntry>();
int mPos = 0;
public class SortEntry {
public String key;
public int order;
}
//直接初始化,加快比较速度,在G3上从3s->0.2s
@SuppressWarnings("rawtypes")
private Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
@SuppressWarnings("unchecked")
public Comparator<SortEntry> comparator = new Comparator<SortEntry>(){
@Override
public int compare(SortEntry entry1, SortEntry entry2) {
return cmp.compare(entry1.key, entry2.key);
}
};
public SortCursor(Cursor cursor,String columnName) {
super(cursor);
MusicLog.i("MediaScanner", "start-----------");
// TODO Auto-generated constructor stub
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);
}
}
MusicLog.i("MediaScanner", "start1-----------");
//排序
Collections.sort(sortList,comparator);
MusicLog.i("MediaScanner", "start2-----------");
}
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;
}
}
参考文章Android 对汉字字符串按照拼音排序http://hi.baidu.com/luyanlong1/blog/item/2c31b51d938b79ecae5133fc.htmlThe Busy Coder's Guide to Android Development 这本书应该也不错,推荐下
分享到:
相关推荐
Android cursor的详细说明,对于新手来说比较有用
android 使用 Cursor 访问数据库 生成 ListView 并获取选中项的值
Android 基于libaums实现读写U盘文件,相关博客:https://blog.csdn.net/a512337862/article/details/80505128
在Android开发中 我们经常会需要在Android界面上弹出一些对话框 比如询问用户或者让用户选择 关于Android Dialog的使用方法 已经有很多blog做出了详细的介绍(比如博客:7种形式的Android Dialog使用举例) 但是只是...
Cursor
Android App调试内存泄露之Cursor.zip
本文简述了android的cursor的用法,通过本文你可以熟悉的掌握cursor的用法,通过实际的例程讲解
Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...
Cursor.so利用GPT技术,将开发者的自然语言描述转化为代码,从而实现代码的快速生成。 Cursor.so和GPT的合作关系可以分为两个方面:一是Cursor.so利用GPT技术生成代码,二是Cursor.so通过GPT技术进行代码补全和代码...
第7章对ContentProvider的创建和启动、SQLite、Cursor query和close的实现等进行了深入分析;第8章以ContentService和AccountManagerService为分析对象,介绍了数据更新通知机制的实现,以及账户管理和数据同步等...
本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例,同时该方法同样适合于其他需要检测资源泄露的情况,感兴趣的朋友可以了解下
import android.database.Cursor; import android.database.sqlite.SQLiteCursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android....
一个(某种功能的)示例,说明如何使用浮动窗口和可访问性服务在 Android 上模拟鼠标以单击视图。 用法 在 Android Studio 中打开项目并在您的设备上运行。 前往“设置”>“辅助功能”并打开“鼠标光标”。 将...
本篇文章是对Android中Cursor相关的性能问题进行了详细的分析介绍,需要的朋友参考下
android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
"Android通话记录备份实现参考" Android通话记录备份实现是指将 Android 设备中的通话记录导出到 SD 卡或其他存储设备中,以便在更换手机或需要时可以恢复通话记录。下面是 Android 通话记录备份实现的相关知识点...
Android开发实验---通讯录 实验报告 通讯录 姓名: 学号: 课程名称: 移动应用开发 所在学院: 信息科学与工程学院 专业班级: 计算机 任课教师: ... import android.database.Cursor; import android.database.
Cursor 0.2.1安装包
全新代码编辑器 Cursor window版本0.1.11