`
jamking
  • 浏览: 9212 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

android下对于Cursor的中文拼音排序实现

阅读更多
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 这本书应该也不错,推荐下
1
4
分享到:
评论

相关推荐

    Android实现通讯录(带有拼音首字母排序的和过滤搜索

    总的来说,实现一个带有拼音首字母排序和过滤搜索功能的Android通讯录应用,涉及到Android系统的ContentResolver、ContactsContract、自定义Adapter、汉字转拼音、数据排序和过滤等多个知识点。这个过程既锻炼了...

    android联系人字母排序和搜索

    本篇文章将详细探讨这一主题,重点关注如何在Android应用中实现联系人的字母排序和搜索功能,特别是对于包含中文姓名的情况。 一、联系人数据获取 首先,我们需要获取到设备上的联系人数据。Android提供了一个...

    Android手机通讯录快速筛选联系人

    这通常涉及到对存储在SQLite数据库中的联系人信息进行查询和排序,确保它们按照中文姓名的拼音首字母或汉字笔画进行排列。Android提供了`ContentResolver`和`Cursor`类,通过它们可以方便地操作系统联系人数据。 在...

    android仿手机通讯录效果

    这里可以创建一个辅助类,如`PinyinHelper`,用来将汉字转换为拼音,然后根据拼音的首字母进行排序。这个过程可能需要用到第三方库,如`android-pinyin4j`。将所有联系人按拼音首字母分组,可以使用Java的`TreeMap`...

    android通讯录搜素

    这里我们将深入探讨如何实现“android通讯录搜索”,包括模糊搜索、拼音、汉字、首字母以及电话号码的查找。 首先,我们需要理解Android中的数据存储方式。在Android系统中,联系人数据通常存储在ContentProvider中...

    城市选择列表

    总的来说,"城市选择列表"是一个典型的Android应用功能,它融合了ListView的列表展示、拼音排序、快速定位以及固定头等技术,展示了Android UI开发中的多项关键技巧。开发者在实现类似功能时,需要关注数据加载效率...

    Android使用AsyncQueryHandler实现获取手机联系人功能

    每个联系人对象包含联系人ID、姓名、手机号、排序键、头像ID、查找键、选定状态、格式化号码和姓名的汉语拼音等属性: ```java public class Contact { private int contactId; private String displayName; ...

    Android 联系人数据库介绍以及对联系人的基本操作.ppt

    该表保存了联系人的 RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。 3. mimetypes 表 mimetypes 表用于定义所有的 MimeTypeID,即联系人的...

    ListView使用索引字母

    4. **拼音转换**:在中文环境中,我们通常需要对数据进行拼音转换,以便根据首字母进行排序。这可以通过Java的Pinyin4j库或者其他类似的库实现。 5. **HeaderView和FooterView**:在`ListView`的顶部或底部添加一个...

    享兼职移动APP-3期(AL028) AL028030200007 详细设计书7-存储模块.doc

    这些数据在应用启动时加载,按照拼音排序并显示在ListView中。城市选择页面使用CityPickerActivity,通过SQLite的SQLiteDatabase类来操作数据库,获取所有城市数据并绑定到列表视图上。 兼职提醒存储模块则设计了一...

Global site tag (gtag.js) - Google Analytics