마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰에서 Collections.sort 로 정렬방법 질문입니다.

0 추천

현재 나의 위치를 받아와서 대상과의 거리를 계산하여 리스트뷰에 쀼려지는 것까지는 잘 작동합니다.

그런데 리스트뷰에서 거리순으로 정렬을 하려고 하는데,

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;
	    } 
	}
}

 

동네영웅 (220 포인트) 님이 2014년 9월 22일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...