현재 나의 위치를 받아와서 대상과의 거리를 계산하여 리스트뷰에 쀼려지는 것까지는 잘 작동합니다.
그런데 리스트뷰에서 거리순으로 정렬을 하려고 하는데,
Collections.sort 를 사용하려고 하는데 비교를 어떻게 해야할지 전혀 감이 안잡힙니다 ㅡㅜ
이름순으로 정렬하는 것은 Collections.sort 로 해결을 했는데
나와의 거리값인 distances는 어떻게 정렬해야할지..
도움 부탁드립니다...
public class MainActivity extends Activity{
ArrayList<HashMap<String, Object>> originalValues;
private CustomAdapter adapter;
LayoutInflater inflater;
double x,y;
Timer timer;
LocationManager lm;
boolean gps_enabled = false;
boolean network_enabled = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView insurListView = (ListView) findViewById(android.R.id.list);
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
String names[] = {
"Messi",
"Ronaldo",
"Kaka",
"Robben",
"Suarez",
};
Double lati[] = {
35.000001,
26.000001,
67.000001,
15.000001,
79.000001
};
Double longi[] = {
129.000001,
159.000001,
100.000001,
131.000001,
162.000001,
};
originalValues = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> temp;
int oriname = names.length;
for (int i = 0; i < oriname; i++) {
temp = new HashMap<String, Object>();
temp.put("name", names[i]);
temp.put("lati", lati[i]);
temp.put("longi", longi[i]);
originalValues.add(temp);
}
adapter = new CustomAdapter(this,R.layout.list_row, originalValues);
insurListView.setAdapter(adapter);
private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>> {
public CustomAdapter(Context context, int textViewResourceId,
ArrayList<HashMap<String, Object>> Strings) {
super(context, textViewResourceId, Strings);
}
private class ViewHolder {
TextView name;
TextView distance;
}
ViewHolder viewHolder;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
double sLat = Double.valueOf(originalValues.get(position).get("lati").toString());
double sLng = Double.valueOf(originalValues.get(position).get("longi").toString());
//my location
double eLat = Double.valueOf(x);
double eLng = Double.valueOf(y);
String distance = SocialUtil.calcDistance(sLat, sLng, eLat, eLng);
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_row, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.distance = (TextView) convertView.findViewById(R.id.distance);
convertView.setTag(viewHolder);
} else
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.name.setText(originalValues.get(position).get("name").toString());
viewHolder.distance.setText(distance);
return convertView;
}
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
timer.cancel();
x =location.getLatitude();
y = location.getLongitude();
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
adapter.notifyDataSetChanged(); //reflesh
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
timer.cancel();
x = location.getLatitude();
y = location.getLongitude();
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
adapter.notifyDataSetChanged(); //reflesh
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
public static class SocialUtil {
public static String calcDistance(double lat1, double lon1, double lat2, double lon2){
double EARTH_R, Rad, radLat1, radLat2, radDist;
double distance, ret;
EARTH_R = 6371000.0;
Rad = Math.PI/180;
radLat1 = Rad * lat1;
radLat2 = Rad * lat2;
radDist = Rad * (lon1 - lon2);
distance = Math.sin(radLat1) * Math.sin(radLat2);
distance = distance + Math.cos(radLat1) * Math.cos(radLat2) * Math.cos(radDist);
ret = EARTH_R * Math.acos(distance);
double rslt = Math.round(Math.round(ret) / 1000);
String result = rslt + " km";
if(rslt == 0) result = Math.round(ret) +" m";
return result;
}
}
}