2015-01-19 3 views
2

Я тестировал образец кода от foursquare-apiAndroid ArrayList, как получить OnClick из ListView

То, что я хотел бы знать, как я могу получить деталь OnClick для представления списка?

поэтому после получения списка места проведения, если пользователь нажмет на элемент списка, я хочу отправить имя проспекта другому фрагменту, чтобы обработать его.

благодаря

Java Кодирование

ArrayList<FoursquareVenue> venuesList; 
    ArrayAdapter<String> myAdapter; 

private static ArrayList<FoursquareVenue> parseFoursquare(final String response) { 

ArrayList<FoursquareVenue> temp = new ArrayList<FoursquareVenue>(); 
try { 

    // make an jsonObject in order to parse the response 
    JSONObject jsonObject = new JSONObject(response); 

    // make an jsonObject in order to parse the response 
    if (jsonObject.has("response")) { 
     if (jsonObject.getJSONObject("response").has("venues")) { 
      JSONArray jsonArray = jsonObject.getJSONObject("response").getJSONArray("venues"); 

      for (int i = 0; i < jsonArray.length(); i++) { 
       FoursquareVenue poi = new FoursquareVenue(); 
       if (jsonArray.getJSONObject(i).has("name")) { 
        poi.setName(jsonArray.getJSONObject(i).getString("name")); 

        if (jsonArray.getJSONObject(i).has("location")) { 
         if (jsonArray.getJSONObject(i).getJSONObject("location").has("address")) { 
          if (jsonArray.getJSONObject(i).getJSONObject("location").has("city")) { 
           poi.setCity(jsonArray.getJSONObject(i).getJSONObject("location").getString("city")); 
          } 
          if (jsonArray.getJSONObject(i).has("categories")) { 
           if (jsonArray.getJSONObject(i).getJSONArray("categories").length() > 0) { 
            if (jsonArray.getJSONObject(i).getJSONArray("categories").getJSONObject(0).has("icon")) { 
             poi.setCategory(jsonArray.getJSONObject(i).getJSONArray("categories").getJSONObject(0).getString("name")); 
            } 
           } 
          } 
          temp.add(poi); 
         } 
        } 
       } 
      } 
     } 
    } 

} catch (Exception e) { 
    e.printStackTrace(); 
    return new ArrayList<FoursquareVenue>(); 
} 
return temp; 

} 

@Override 
protected void onPostExecute(String result) { 
    if (temp == null) { 
     // we have an error to the call 
     // we can also stop the progress bar 
    } else { 
     // all things went right 

     // parseFoursquare venues search result 
     venuesList = (ArrayList<FoursquareVenue>) parseFoursquare(temp); 

     List<String> listTitle = new ArrayList<String>(); 

     for (int i = 0; i < venuesList.size(); i++) { 
      // make a list of the venus that are loaded in the list. 
      // show the name, the category and the city 
      listTitle.add(i, venuesList.get(i).getName() + ", " + venuesList.get(i).getCategory() + "" + venuesList.get(i).getCity()); 
     } 

     // set the results to the list 
     // and show them in the xml 
     myAdapter = new ArrayAdapter<String>(LocationActivity.this, R.layout.row_layout, R.id.listText, listTitle); 
     setListAdapter(myAdapter); 
    } 
} 

Благодаря

Я попытался это:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    Toast.makeText(getApplicationContext(), "position => " + position + 
      " - ListView =>" + l + 
      " - View => " + v + 
      " - id => " + id 
      , Toast.LENGTH_LONG).show(); 
} 

я могу GE t позиция элемента listView, но я не могу данные списка.

Я также использую это:

public class FoursquareVenue { 
    private String name; 
    private String city; 

    private String category; 

    public FoursquareVenue() { 
     this.name = ""; 
     this.city = ""; 
     this.setCategory(""); 
    } 

    public String getCity() { 
     if (city.length() > 0) { 
      return city; 
     } 
     return city; 
    } 

    public void setCity(String city) { 
     if (city != null) { 
      this.city = city.replaceAll("\\(", "").replaceAll("\\)", ""); 
      ; 
     } 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getCategory() { 
     return category; 
    } 

    public void setCategory(String category) { 
     this.category = category; 
    } 

} 
+0

Вложенные if's с 'getJSONObject' в них выглядит плохо. Я надеюсь, что этот метод не называется много. –

ответ

0

Просто переопределить

onListItemClick(ListView l, View v, int position, long id) 

, который вызывается, когда выбран элемент в списке. Поскольку вы вызываете setListAdapter() Я предполагаю, что вы расширили либо ListActivity, либо ListFragment.

Для извлечения ListView данных используется ListView#getItemAtPosition() способ.

Теперь, вот где вы должны понимать, что использование ArrayAdapter<FoursquareVenue> вместо ArrayAdapter<String> был бы лучше, потому что с версией String, все, что вы могли бы получить с getItemAtPosition(), точно такая же строка, что вы прошли в

listTitle.add(i, venuesList.get(i).getName() + ", " + 
    venuesList.get(i).getCategory() + "" + venuesList.get(i).getCity()); 

который явно не очень гибкий. Вы должны передать свой venuesList непосредственно к адаптеру, как

myAdapter = new ArrayAdapter<FoursquareVenue>(
    LocationActivity.this, R.layout.row_layout, R.id.listText, venuesList); 

, а затем переопределить FoursquareVenue#toString()

public String toString() { 
    return new StringBuilder(name).append(", ") 
      .append(category).append(", ").append(city).toString(); 
} 
+1

Привет, Рави Таплиаль, спасибо. Я пробовал. Я могу получить позицию элемента listView, но я не могу данные списка. Я отредактировал мой вопрос. – Joolah

+0

Для получения элемента списка используйте 'ListView # getItemAtPosition()'. –

0

инициализации вашего ListView из main.xml

listView = (ListView) findViewById(R.id.listview); 
listView.setOnItemClickListener(this);  

и добавить

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 

} 
+0

Требуется, чтобы 'Activity' /' Fragment' излишне реализовывал интерфейс. Не говоря уже о том, чтобы использовать «AdaptView».Оба этих фактора можно избежать. –

+1

Я использую открытый класс LocationActivity extends ListActivity реализует LocationListener {- я не вызываю listView = (ListView) findViewById (R.id.listview) ;. Спасибо за отзыв – Joolah

Смежные вопросы