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.html
The Busy Coder's Guide to Android Development 这本书应该也不错,推荐下
分享到:
相关推荐
总的来说,实现一个带有拼音首字母排序和过滤搜索功能的Android通讯录应用,涉及到Android系统的ContentResolver、ContactsContract、自定义Adapter、汉字转拼音、数据排序和过滤等多个知识点。这个过程既锻炼了...
本篇文章将详细探讨这一主题,重点关注如何在Android应用中实现联系人的字母排序和搜索功能,特别是对于包含中文姓名的情况。 一、联系人数据获取 首先,我们需要获取到设备上的联系人数据。Android提供了一个...
这通常涉及到对存储在SQLite数据库中的联系人信息进行查询和排序,确保它们按照中文姓名的拼音首字母或汉字笔画进行排列。Android提供了`ContentResolver`和`Cursor`类,通过它们可以方便地操作系统联系人数据。 在...
这里可以创建一个辅助类,如`PinyinHelper`,用来将汉字转换为拼音,然后根据拼音的首字母进行排序。这个过程可能需要用到第三方库,如`android-pinyin4j`。将所有联系人按拼音首字母分组,可以使用Java的`TreeMap`...
这里我们将深入探讨如何实现“android通讯录搜索”,包括模糊搜索、拼音、汉字、首字母以及电话号码的查找。 首先,我们需要理解Android中的数据存储方式。在Android系统中,联系人数据通常存储在ContentProvider中...
总的来说,"城市选择列表"是一个典型的Android应用功能,它融合了ListView的列表展示、拼音排序、快速定位以及固定头等技术,展示了Android UI开发中的多项关键技巧。开发者在实现类似功能时,需要关注数据加载效率...
每个联系人对象包含联系人ID、姓名、手机号、排序键、头像ID、查找键、选定状态、格式化号码和姓名的汉语拼音等属性: ```java public class Contact { private int contactId; private String displayName; ...
该表保存了联系人的 RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。 3. mimetypes 表 mimetypes 表用于定义所有的 MimeTypeID,即联系人的...
4. **拼音转换**:在中文环境中,我们通常需要对数据进行拼音转换,以便根据首字母进行排序。这可以通过Java的Pinyin4j库或者其他类似的库实现。 5. **HeaderView和FooterView**:在`ListView`的顶部或底部添加一个...
这些数据在应用启动时加载,按照拼音排序并显示在ListView中。城市选择页面使用CityPickerActivity,通过SQLite的SQLiteDatabase类来操作数据库,获取所有城市数据并绑定到列表视图上。 兼职提醒存储模块则设计了一...