SuspensionIndexBar 排序bug修复

Android 专栏收录该内容
3 篇文章 0 订阅

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

经测试,问题得到了解决

  • 4
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值