动态创建CardView按距离排序失效,重写compare方法无效求解决
解决按用户距离排序失效的问题
嘿,我一眼就瞅出你排序失效的问题所在啦!你在compare方法里直接把距离差值强转成int,这可是个大坑——
当两个用户的距离差值小于1的时候(比如一个是2.4公里,另一个是2.7公里),差值是-0.3,强转成int就变成0了。而compare方法返回0的话,排序算法会认为这两个用户的优先级相等,不会调整它们的顺序,自然就达不到你想要的“最近优先”的效果。
给你两个靠谱的修复方案:
方案一:用Double.compare()简化实现
直接借助Java自带的Double.compare方法,它会帮你正确处理所有浮点数的比较逻辑,不用自己折腾强转:
@Override public int compare(Users o1, Users o2) { // 升序排列:距离小的(更近的)排在前面 return Double.compare(o1.getDistance(), o2.getDistance()); }
方案二:手动判断差值的正负
如果你想自己控制逻辑,就直接判断差值的正负,返回对应的-1、1、0:
@Override public int compare(Users o1, Users o2) { double distanceDiff = o1.getDistance() - o2.getDistance(); if (distanceDiff < 0) { return -1; // o1比o2近,排在前面 } else if (distanceDiff > 0) { return 1; // o2比o1近,排在前面 } else { return 0; // 距离相等,顺序不变 } }
另外还要提醒你几个关键点:
- 先确认
getDistance()方法计算出来的距离是正确的!如果距离本身算错了,再怎么排序都是白搭。 - 排序完成后,如果你是用RecyclerView展示这些CardView,一定要调用
notifyDataSetChanged()(或者更高效的局部刷新方法),不然UI不会更新排序后的结果。 - 确保你是用这个Comparator来调用
Collections.sort(userList, yourComparator),或者在RecyclerView的Adapter里正确设置了排序逻辑。
内容的提问来源于stack exchange,提问作者Werokk
相关产品推荐
相关产品推荐

