公司项目引用了张旭童大神的SuspensionIndexBar,效果是仿微信通讯录,字母标题分组悬停且有右侧菜单条
相关连接 :
http://blog.csdn.net/zxt0601/article/details/52355199
https://github.com/mcxtzhang/ItemDecorationIndexBar
但是近期出现了显示错乱的问题,经过检查发现列表数据源在set进SuspensionIndexBar时,排序部分抛出了异常
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:773)
at java.util.TimSort.mergeAt(TimSort.java:510)at java.util.TimSort.mergeCollapse(TimSort.java:437)
at java.util.TimSort.sort(TimSort.java:241)
at java.util.Arrays.sort(Arrays.java:1523)
at java.util.Collections.sort(Collections.java:238)
经过搜索得知此异常为
Collections.sort
返回必须遵循排序规则
所以将 com.mcxtzhang.indexlib.IndexBar.helper.IndexBarDataHelperImpl.java文件中的
@Override
public IIndexBarDataHelper sortSourceDatas(List<? extends BaseIndexPinyinBean> datas) {
if (null == datas || datas.isEmpty()) {
return this;
}
convert(datas);
fillInexTag(datas);
//对数据源进行排序
Collections.sort(datas, new Comparator<BaseIndexPinyinBean>() {
@Override
public int compare(BaseIndexPinyinBean lhs, BaseIndexPinyinBean rhs) {
if (!lhs.isNeedToPinyin()) {
return 0;
} else if (!rhs.isNeedToPinyin()) {
return 0;
} else if (lhs.getBaseIndexTag().equals("#")) {
return 1;
} else if (rhs.getBaseIndexTag().equals("#")) {
return -1;
} else {
return lhs.getBaseIndexPinyin().compareTo(rhs.getBaseIndexPinyin());
}
}
});
return this;
}
修改为
@Override
public IIndexBarDataHelper sortSourceDatas(List<? extends BaseIndexPinyinBean> datas) {
if (null == datas || datas.isEmpty()) {
return this;
}
convert(datas);
fillInexTag(datas);
//对数据源进行排序
Collections.sort(datas, new Comparator<BaseIndexPinyinBean>() {
@Override
public int compare(BaseIndexPinyinBean lhs, BaseIndexPinyinBean rhs) {
boolean flag;
if (!lhs.isNeedToPinyin()) {
return 0;
} else if (!rhs.isNeedToPinyin()) {
return 0;
} else if ((flag = lhs.getBaseIndexTag().startsWith("#")) ^ rhs.getBaseIndexTag().startsWith("#")) {
return flag ? 1 : -1;
}
return lhs.getBaseIndexPinyin().compareTo(rhs.getBaseIndexPinyin());
}
});
return this;
}
经测试,问题得到了解决