2012-11-16 2 views
1

사용자가 위치별로 검색하고 위치 정보를 저장할 수있는 Android 앱을 제작 중입니다. 검색 상자에는 자동 완성 기능이 있으므로 언제든지 사용자 유형을 입력하면 실제로 상자에 제안 목록을 가져올 수 있습니다. 나는 이것을 내 상자에 구현했습니다. 이를 위해이 자습서를 사용하여 별도의 데이터 어댑터를 구현했습니다. 그러나 여기에서는 이름 목록 만 얻을 수 있지만, 위도와 경도도 필요합니다. 나는 그것을 어떻게 얻을 수 있는가? 여기에서 위치보기 파일에 내 코드, 여기json 개체, Android 및 Google지도 api를 통해 자동 완성 검색 기능에서 위치 정보 가져 오기

LOC= (AutoCompleteTextView) findViewById(R.id.autoCompleteEditText1); 
     Context ctx=this; 
     LOC.setAdapter(new com.cuet.csezeroseven.dao.PlacesAutoCompleteAdapter(this, 
       R.layout.list_item)); 

그리고이가 완전히 this 튜토리얼에 따라 작성

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.ArrayList; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.content.Context; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 



public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements 
     Filterable { 
    private ArrayList<String> resultList; 
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String OUT_JSON = "/json"; 
    //do not change this key 
    private static final String API_KEY = "my_key"; 
    private static final String TAG = "tag"; 

    public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 

    @Override 
    public int getCount() { 
     return resultList.size(); 
    } 

    @Override 
    public String getItem(int index) { 
     return resultList.get(index); 
    } 

    public static ArrayList<String> autocomplete(String input) { 

     ArrayList<String> resultList = null; 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 
     try { 
      StringBuilder sb = new StringBuilder(PLACES_API_BASE 
        + TYPE_AUTOCOMPLETE + OUT_JSON); 
      sb.append("?sensor=false&key=" + API_KEY); 
      sb.append("&components=country:us"); 
      sb.append("&input=" + URLEncoder.encode(input, "utf8")); 

      URL url = new URL(sb.toString()); 
      conn = (HttpURLConnection) url.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 
      } 
     } catch (MalformedURLException e) { 
      Log.e(TAG, "Error processing Places API URL", e); 
      return resultList; 
     } catch (IOException e) { 
      Log.e(TAG, "Error connecting to Places API", e); 
      return resultList; 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
     } 

     try { 
      // Create a JSON object hierarchy from the results 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
      JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); 

      // Extract the Place descriptions from the results 
      resultList = new ArrayList<String>(predsJsonArray.length()); 
      for (int i = 0; i < predsJsonArray.length(); i++) { 
       resultList.add(predsJsonArray.getJSONObject(i).getString(
         "description")); 
      } 

     } catch (JSONException e) { 
      Log.e(TAG, "Cannot process JSON results", e); 
     } 

     return resultList; 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       if (constraint != null) { 
        // Retrieve the autocomplete results. 

        resultList = autocomplete(constraint 
          .toString()); 

        // Assign the data to the FilterResults 
        filterResults.values = resultList; 
        filterResults.count = resultList.size(); 
       } 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
       if (results != null && results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
     return filter; 
    } 
} 

내가 사용하는 데이터 어댑터는,이다.

답변

관련 문제