import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by XU on 2017/3/2.
*/
public class SortCursor extends CursorWrapper {
/**
* Creates a cursor wrapper.
*
* @param cursor The underlying cursor to wrap.
*/
private static final String LOGTAG = "SortCursor";
public static final int SORT_LETTER_BEFORE_NUM = 1;
private int mSortType;
private int mPos;
private Cursor mCursor;
/**
* @param cursor
* @param sortType
*/
public SortCursor(Cursor cursor, int sortType) {
super(cursor);
mSortType = sortType;
mPos = -1;
mCursor = cursor;
initSortList();
EexecuteSortList();
}
/**
* 建立与Cursor对应的索引表
*/
public void initSortList() {
LogUtils.i(LOGTAG, "56 SortCursor initSortList");
int i = 0;
DOWAApp.mRosterInfoList.clear();
if (mCursor == null || !mCursor.moveToFirst()) {
return;
}
LogUtils.i(LOGTAG, mCursor.getCount() + "");
do {
RosterInfo rosterInfo = new RosterInfo();
//sortKey.clearRoster();
rosterInfo.otherJid = mCursor.getString(mCursor
.getColumnIndexOrThrow(RosterConstants.OTHER_JID));
rosterInfo.alias = mCursor.getString(mCursor
.getColumnIndexOrThrow(RosterConstants.ALIAS));
// sortKey.status_mode = mCursor.getString(mCursor
// .getColumnIndexOrThrow(RosterConstants.STATUS_MODE));
// sortKey.status_message = mCursor.getString(mCursor
// .getColumnIndexOrThrow(RosterConstants.STATUS_MESSAGE));
// sortKey.group = mCursor.getString(mCursor
// .getColumnIndexOrThrow(RosterConstants.GROUP));
rosterInfo.order = i++;
LogUtils.v(LOGTAG, rosterInfo.toString());
DOWAApp.mRosterInfoList.add(rosterInfo);
} while (mCursor.moveToNext());
}
/**
* 对表进行排序
*/
protected void EexecuteSortList() {
if (DOWAApp.mRosterInfoList == null || DOWAApp.mRosterInfoList.size() <= 1) {
return;
}
LogUtils.i(LOGTAG, "DOWAApp.mRosterInfoList.size()=" + DOWAApp.mRosterInfoList.size());
for (int i = 0; i < DOWAApp.mRosterInfoList.size(); i++) {
LogUtils.i(LOGTAG, "i=" + i);
LogUtils.i(LOGTAG, "DOWAApp.mRosterInfoList.get(i)=" + DOWAApp.mRosterInfoList.get(i));
LogUtils.i(LOGTAG, "DOWAApp.mRosterInfoList.get(i).getAlias()=" + DOWAApp.mRosterInfoList.get(i).getAlias());
//DOWAApp.mRosterInfoList.get(i).getOtherJid();
}
ComparatorEx comparator = new ComparatorEx();
Collections.sort(DOWAApp.mRosterInfoList, comparator);
LogUtils.i(LOGTAG, "排序后的 列表 DOWAApp.mRosterInfoList.size()=" + DOWAApp.mRosterInfoList.size());
for (int i = 0; i < DOWAApp.mRosterInfoList.size(); i++) {
LogUtils.i(LOGTAG, "DOWAApp.mRosterInfoList.get(i).getAlias()=" + DOWAApp.mRosterInfoList.get(i).getAlias());
//DOWAApp.mRosterInfoList.get(i).getOtherJid();
}
}
public List<RosterInfo> getRostList() {
return DOWAApp.mRosterInfoList;
}
/**
* 比较
*/
public class ComparatorEx implements Comparator {
@Override
public int compare(Object obj1, Object obj2) {
RosterInfo entry1 = (RosterInfo) obj1;
RosterInfo entry2 = (RosterInfo) obj2;
switch (mSortType) {
case SORT_LETTER_BEFORE_NUM:
return compareLetterBeforeNumByAlias(entry1, entry2);
default:
return 0;
}
}
/**
* @param entry1
* @param entry2
* @return
*/
protected int compareLetterBeforeNumByAlias(RosterInfo entry1, RosterInfo entry2) {
if (entry1.alias == null) {
entry1.alias = entry1.getOtherJid();
}
if (entry2.alias == null) {
entry2.alias = entry2.getOtherJid();
}
String o1 = PinyinUtils.getPingYin(entry1.alias);
String o2 = PinyinUtils.getPingYin(entry2.alias);
int c1 = (o1.charAt(0) + "").toUpperCase().hashCode();
int c2 = (o2.charAt(0) + "").toUpperCase().hashCode();
boolean c1Flag = (c1 < "A".hashCode() || c1 > "Z".hashCode()); // 不是字母
boolean c2Flag = (c2 < "A".hashCode() || c2 > "Z".hashCode()); // 不是字母
if (c1Flag && !c2Flag) {
return 1;
} else if (!c1Flag && c2Flag) {
return -1;
}
return o1.toUpperCase().compareTo(o2.toUpperCase());//如果比较的字符串全为英文字母或者全为数字,则按正常比较
}
}
/**
* 获取列表中每一项的实际位置
*
* @param position
* @return
*/
protected int getRelativePos(int position) {
int relativePos = position;
switch (mSortType) {
case SORT_LETTER_BEFORE_NUM:
//LogUtils.i(TAG, "152 sortcursor position="+position);
relativePos = DOWAApp.mRosterInfoList.get(position).order;
//LogUtils.i(TAG, "154 sortcursor relativePos="+relativePos);
//LogUtils.i(TAG, "relativePos=" + relativePos);
break;
default:
break;
}
//
//LogUtils.v(LOGTAG, "ThreadMsgSortCursor-->position-->" + position +
//" relativePos --->" + relativePos);
return relativePos;
}
/**
* @param position
* @return
*/
public boolean moveToPosition(int position) {
// mPos = position;
// //
// int order = getRelativePos(position);
// //LogUtils.i(TAG, "order=" + order);
// return mCursor.moveToPosition(order);
//LogUtils.i(TAG, "176 sortcursor DOWAApp.mRosterInfoList.size()="+DOWAApp.mRosterInfoList.size());
//LogUtils.i(TAG, "177 sortcursor position="+position);
if (position >= 0 && position < DOWAApp.mRosterInfoList.size()) {
mPos = position;
int order = getRelativePos(position);
//int order = DOWAApp.mRosterInfoList.get(position).order;
return mCursor.moveToPosition(order);
}
if (position < 0) {
mPos = -1;
}
if (position >= DOWAApp.mRosterInfoList.size()) {
mPos = DOWAApp.mRosterInfoList.size();
}
return mCursor.moveToPosition(position);
}
public boolean moveToFirst() {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->moveToFirst------");
return moveToPosition(0);
}
public boolean moveToLast() {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->moveToLast------");
return moveToPosition(getCount() - 1);
}
public boolean moveToNext() {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->moveToNext------mPos=" + mPos);
return moveToPosition(mPos + 1);
}
public boolean moveToPrevious() {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->moveToPrevious------");
return moveToPosition(mPos - 1);
}
public boolean move(int offset) {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->move------");
return moveToPosition(mPos + offset);
}
public int getPosition() {
return mPos;
}
public void close_() {
LogUtils.v(LOGTAG, "ThreadMsgSortCursor---------->close------");
mCursor.close();
}
}
Android对Cursor排序
最新推荐文章于 2024-04-27 18:36:11 发布