SuspensionIndexBar 排序bug修复

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012470191/article/details/80350542

公司项目引用了张旭童大神的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;
}

经测试,问题得到了解决

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页