问题
I put JSON data to the ListView. I want data in the list("ItemTitle", "ItemText", "latit", "longit", "date") can transfer to another activity(result.java)when item is clicked. Here are the code:
activity:
public class Earthquake extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.earthquake);
getData();
}
private void getData() {
// TODO Auto-generated method stub
ListView list = (ListView)findViewById(R.id.earthquake);
try {
List<News> newes = GetJson.update();
List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
for(News news : newes){
HashMap<String, Object> item = new HashMap<String, Object>();
item.put("ItemTitle", news.getPlace());
item.put("ItemText", "Magnitude: "+news.getMag());
item.put("latit", news.getLatit());
item.put("longit", news.getLongit());
item.put("date", news.getTime());
data.add(item);
}
SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_earthquake,
new String[]{"ItemTitle", "ItemText", "latit", "longit", "date"},
new int[]{R.id.ItemTitle, R.id.ItemText, R.id.latit, R.id.longit, R.id.date});
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//intent
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
GetJson.java:
public class GetJson {
public static List<News> update() throws Exception, IOException {
// TODO Auto-generated method stub
String path = "http://earthquake.usgs.gov/earthquakes/feed/geojson/all/hour";
HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
InputStream json = conn.getInputStream();
return parseJSON(json);
}
return null;
}
private static List<News> parseJSON(InputStream jsonStream) throws Exception {
// TODO Auto-generated method stub
List<News> list = new ArrayList<News>();
byte[] data = StreamTool.read(jsonStream);
String json = new String(data);
//start decoad JSON
JSONObject jsonObject1 = new JSONObject(json);
String object1 = jsonObject1.getString("features");
JSONArray features = new JSONArray(object1);
for(int i = 0; i < features.length(); i++){
JSONObject object2 = features.getJSONObject(i);
JSONObject properties = object2.getJSONObject("properties");
String place = properties.getString("place");
int mag = properties.getInt("mag");
String time = properties.getString("time");
JSONObject geometry = object2.getJSONObject("geometry");
JSONArray coordinates = geometry.getJSONArray("coordinates");
String longit = coordinates.getString(0);
String latit = coordinates.getString(1);
list.add(new News(mag, longit, latit, place, time));
}
return list;
}
}
News.java:
public class News {
private Integer mag;
private String longit;
private String latit;
private String place, time;
public News(){}
public News(Integer mag, String longit, String latit, String place, String time){
this.mag = mag;
this.longit = longit;
this.latit = latit;
this.place = place;
this.time = time;
}
public Integer getMag(){
return mag;
}
public String getLongit(){
return longit;
}
public String getLatit(){
return latit;
}
public String getPlace(){
return place;
}
public String getTime(){
return time;
}
}
Thanks!!
回答1:
I suggest you rewrite your SimpleAdapter
to extends ArrayAdapter<News>
. Creating another List
of HasMap
s is quite useless and consumes additional memory. Than make your News
class implement Parcelable
. And in onClick()
you call something like:
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
News news = parent.getItem(position);
if (news != null) {
Intent intent = new Intent(...);
intent.put("news", news);
startActivity(intent);
}
}
回答2:
Always use a non-UI thread to fetch data from servers. Looking at your code it looks like you are using the UI thread to fetch data. You may use AsyncTask
and paste the code written in the GetJson
class in the doInBackground
method of an AsyncTask
object.
Now about your problem to pass the clicked list item data to the next activity. You will have to either make the class News
implement Parcelable
or Serializable
interface. implementing these classes allows you to send the custom object data to another activity. The most efficient way is to implement Parcelable
.
Check the following links for more details: http://developer.android.com/reference/android/os/Parcelable.html
http://developer.android.com/reference/java/io/Serializable.html
Hope this explanation helps.
来源:https://stackoverflow.com/questions/11685611/intent-with-listview-json-data