android根据Double类型数据经纬度算出距离再根据距离实现排序功能

前言

项目中用到全国的加油站数据加载
并根据经纬度算出距离 然后根据距离从近到远排序
主要是数据类型是Double 这里必须对数据进行封装
实现也不难 这里讲一下自己的实现方法和实现思路

效果图

先来看下 未排序下的效果图


仔细看上图中的距离 是没有排序的 距离都是打乱的 我们的目的是从小到大完成排序。

Double类型数据排序

 Collections.sort(mList, new Comparator() {
            public int compare(State o1, State o2) {
               //这里的数据类型如果是double 会报错
               //错误提示:cannot invoke compareTo(double) on the primitive type double
             return o1.compareTo(o2);                 
            }
        });

double不能直接排序的解决方法

compareTo只适合实现了Comparable的对象类型
   // 第一种修改方法:
        Collections.sort(mList, new Comparator() {
            public int compare(State o1, State o2) { 
                return new Double(o1).compareTo(new Double(o2));
            }
        });
    }
 

    // 第二种解决方法是:
    double distance;//对distance的定义

   //修改为: 
   Double distance;  
   //distance改为double的包装类Double类型
}

排序代码实现

根据我们拿到的数据 然后对数据做处理 也就是计算 拿到每个Bean里的经纬度

 if (homeModelBaseBean.getCode() == SUCCESS) {
 			//拿到数据
            List data = homeModelBaseBean.getData();
      		//非空判断
            if (data != null && data.size() > 0) {
                for (int i = 0; i < data.size(); i++) {
                	//排序接口 实现compare
                    Collections.sort(data, new Comparator() {
                        @Override
                        public int compare(HomeModel o1, HomeModel o2) {
                        	//这里拿到当前经纬度和油站经纬度通过Utils算出每个油站距离当前的距离
                        	//再根据距离实现从近到远的排序
                            double dis = GetDistanceUtils.getDistance(latLng.longitude,
                                    latLng.latitude, o1.getGasAddressLongitude(),
                                     o1.getGasAddressLatitude());
                            double dis2 = GetDistanceUtils.getDistance(latLng.longitude, 
                            latLng.latitude,
                                    o2.getGasAddressLongitude(), o2.getGasAddressLatitude());
                             //打印log看下数据排序
                            Log.e(TAG, "算出距离为:" + dis);
                            //这里使用第一种修改方法 new Double类型
                            //因为这个距离是算出来的 并不是后台返回定义的类型
                            return new Double(dis).compareTo(dis2);
                        }
                    });
                }
            }
            mHomeView.showGasList(data);
        } else {
            mHomeView.showNetWorkError();
        }

Log输出

log打印出根据经纬度算出的油站距离 注:以下数据有重叠 但不影响实际排序
android根据Double类型数据经纬度算出距离再根据距离实现排序功能_第1张图片

排序实现gif(距离从近到远)

总结

目前项目中涉及到的排序有点多 距离排序,价格排序,还有油种的排序、
这些都方法类似
但是涉及到联动排序 有些复杂 有时间也总结一篇博文!

共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
android根据Double类型数据经纬度算出距离再根据距离实现排序功能_第2张图片

你可能感兴趣的:(Java,学习,Android,技术)