2017-06-26 2 views
-1

Ich versuche Google Orte Daten von Google API zu erhalten und in Listview anzuzeigen. Es ist mir gelungen, Daten und Einstellungen auf den Adapter zu bekommen, aber nicht in der Listenansicht.Daten nicht in Listview in Android angezeigt

Hauptaktivität. java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    lv=(ListView)findViewById(R.id.listView); 

    StringBuilder sbValue = new StringBuilder(sbMethod()); 
    PlacesTask placesTask = new PlacesTask(); 
    placesTask.execute(sbValue.toString()); 

    MyAdapter adapter=new MyAdapter(MainActivity.this,R.layout.my_adapter_item,arr); 
    lv.setAdapter(adapter); 
} 

public StringBuilder sbMethod() { 

    //use your current location here 
    double mLatitude =-33.8670522; 
    double mLongitude =151.1957362; 

    StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
    sb.append("location=" + mLatitude + "," + mLongitude); 
    sb.append("&radius=5000"); 
    sb.append("&types=" + "restaurant"); 
    sb.append("&sensor=true"); 
    sb.append("&key=AIzaSyC2SaN5I5u2eWw3zr4OZoLwD0qvCU-_uUw"); 

    Log.d("Map", "api: " + sb.toString()); 

    return sb; 
} 

private class PlacesTask extends AsyncTask<String, Integer, String> { 

    String data = null; 

    // Invoked by execute() method of this object 
    @Override 
    protected String doInBackground(String... url) { 
     try { 
      data = downloadUrl(url[0]); 
     } catch (Exception e) { 
      Log.d("Background Task", e.toString()); 
     } 
     return data; 
    } 

    // Executed after the complete execution of doInBackground() method 
    @Override 
    protected void onPostExecute(String result) { 
     ParserTask parserTask = new ParserTask(); 

     // Start parsing the Google places in JSON format 
     // Invokes the "doInBackground()" method of the class ParserTask 
     parserTask.execute(result); 
    } 
} 

private String downloadUrl(String strUrl) throws IOException { 
    String data = ""; 
    InputStream iStream = null; 
    HttpURLConnection urlConnection = null; 
    try { 
     URL url = new URL(strUrl); 

     // Creating an http connection to communicate with url 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     // Connecting to url 
     urlConnection.connect(); 

     // Reading data from url 
     iStream = urlConnection.getInputStream(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

     StringBuffer sb = new StringBuffer(); 

     String line = ""; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     data = sb.toString(); 

     br.close(); 

    } catch (Exception e) { 
     Log.d("Exception downloading", e.toString()); 
    } finally { 
     iStream.close(); 
     urlConnection.disconnect(); 
    } 
    return data; 
} 


private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> { 

    JSONObject jObject; 

    // Invoked by execute() method of this object 
    @Override 
    protected List<HashMap<String, String>> doInBackground(String... jsonData) { 

     List<HashMap<String, String>> places = null; 
     Place_JSON placeJson = new Place_JSON(); 

     try { 
      jObject = new JSONObject(jsonData[0]); 

      places = placeJson.parse(jObject); 

     } catch (Exception e) { 
      Log.d("Exception", e.toString()); 
     } 
     return places; 
    } 

    // Executed after the complete execution of doInBackground() method 
    @Override 
    protected void onPostExecute(List<HashMap<String, String>> list) { 



     for (int i = 0; i < list.size(); i++) { 
      HashMap<String, String> hmPlace = list.get(i); 
      double lat = Double.parseDouble(hmPlace.get("lat")); 
      double lng = Double.parseDouble(hmPlace.get("lng")); 

     } 
    } 
} 

public class Place_JSON { 

    /** 
    * Receives a JSONObject and returns a list 
    */ 
    public List<HashMap<String, String>> parse(JSONObject jObject) { 

     JSONArray jPlaces = null; 
     try { 
      /** Retrieves all the elements in the 'places' array */ 
      jPlaces = jObject.getJSONArray("results"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     /** Invoking getPlaces with the array of json object 
     * where each json object represent a place 
     */ 
     return getPlaces(jPlaces); 
    } 

    private List<HashMap<String, String>> getPlaces(JSONArray jPlaces) { 
     int placesCount = jPlaces.length(); 
     List<HashMap<String, String>> placesList = new ArrayList<HashMap<String, String>>(); 
     HashMap<String, String> place = null; 

     /** Taking each place, parses and adds to list object */ 
     for (int i = 0; i < placesCount; i++) { 
      try { 
       /** Call getPlace with place JSON object to parse the place */ 
       place = getPlace((JSONObject) jPlaces.get(i)); 
       placesList.add(place); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
     return placesList; 
    } 

    /** 
    * Parsing the Place JSON object 
    */ 
    private HashMap<String, String> getPlace(JSONObject jPlace) { 

     HashMap<String, String> place = new HashMap<String, String>(); 
     String placeName = "-NA-"; 
     String vicinity = "-NA-"; 
     String latitude = ""; 
     String longitude = ""; 
     String reference = ""; 

     try { 
      // Extracting Place name, if available 
      if (!jPlace.isNull("name")) { 
       placeName = jPlace.getString("name"); 
      } 

      // Extracting Place Vicinity, if available 
      if (!jPlace.isNull("vicinity")) { 
       vicinity = jPlace.getString("vicinity"); 
      } 

      latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat"); 
      longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng"); 
      reference = jPlace.getString("reference"); 

      place.put("place_name", placeName); 
      place.put("vicinity", vicinity); 
      place.put("lat", latitude); 
      place.put("lng", longitude); 
      place.put("reference", reference); 

      map1=new HashMap<String, String>(); 
      map1.put("Name",placeName); 
      map1.put("Vicinity",vicinity); 
      arr.add(map1); 

      Log.w("MainActivity",placeName+";"+vicinity); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return place; 
    } 
} 

Hier bin ich immer Daten von HashMap<String, String> getPlace(JSONObject jPlace) und Einstellung auf den Adapter.

Dieser Adapter ich auf Listenansicht in Oncreate einstellen.

Adapterklasse

public class MyAdapter extends BaseAdapter { 
    ArrayList<HashMap<String, String>> names; 
    int data; 
    Context ctxt; 
    LayoutInflater inflater; 

    public MyAdapter (Context c, int nes, ArrayList<HashMap<String, String>> enj){ 
     this.ctxt = c; 
     this.data = nes; 
     this.names = enj; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return names.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return names.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     // TODO Create the cell (View) and populate it with an element of the array 
     ViewHolder holder = new ViewHolder(); 
     if (convertView == null) { 
      convertView = LayoutInflater.from(ctxt).inflate(data, viewGroup); 
      holder.nam = (TextView) convertView . findViewById (R.id.name); 
      holder.vic = (TextView) convertView . findViewById (R.id.vicinity); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView . getTag(); 
     } 

     holder.nam.setText(names.get(position).get("Name")); 
     holder.vic.setText(names.get(position).get("Vicinity")); 
     return convertView; 
    } 
    class ViewHolder { 
     TextView nam,vic; 
    } 
} 

Hier bin ich die Daten angezeigt werden in Listenansicht nicht in der Lage. Bitte hilf mir dabei.

+0

In Ihrem OnPostExecute() fügen Sie Daten zu Ihrem Array und stellen Sie Ihren Adapter –

+0

Ich habe das auch versucht. Ich bekomme nur eine Daten. Damit das nicht in Listenansicht angezeigt wird –

+0

Drucken Sie das Protokoll Ihrer Listengröße in ParserTask onPostExecute() –

Antwort

1

Sobald der "arr" geändert wurde, müssen wir dem Adapter mitteilen, dass sich der Datensatz geändert hat. In OnPostExecute von ParserTask, fügen Sie folgende Zeile

adapter.notifyDataSetChanged(); 
0

Versuchen zu verwenden:

anstelle dieser

@Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return names.get(arg0); 
    } 

Verwendung

@Override 

    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 
+0

Es gibt keine Änderung im Ergebnis. Immer noch ist die Liste leer –

Verwandte Themen