1

JSON データを ListView に配置します。リスト内のデータ ("ItemTitle"、"ItemText"、"latit"、"longit"、"date") は、アイテムがクリックされたときに別のアクティビティ (result.java) に転送できます。コードは次のとおりです。

アクティビティ:

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

ありがとう!!

4

2 に答える 2

1

SimpleAdapterextendsに書き直すことをお勧めしますArrayAdapter<News>List別の を作成しHasMapてもまったく役に立たず、追加のメモリが消費されます。Newsクラスを実装するよりもParcelable。そして、onClick()あなたは次のようなものを呼び出します:

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);
    }
}
于 2012-07-27T10:31:19.023 に答える
0

サーバーからデータをフェッチするには、常に非UIスレッドを使用してください。コードを見ると、UIスレッドを使用してデータをフェッチしているように見えます。クラスで記述されたコードを使用して、オブジェクトのメソッドにAsyncTask貼り付けることができます。GetJsondoInBackgroundAsyncTask

次に、クリックしたリストアイテムデータを次のアクティビティに渡す問題について説明します。クラスにNews実装ParcelableまたはSerializableインターフェースを作成する必要があります。これらのクラスを実装すると、カスタムオブジェクトデータを別のアクティビティに送信できます。最も効率的な方法は、を実装することParcelableです。

詳細については、次のリンクを確認してください: http: //developer.android.com/reference/android/os/Parcelable.html

http://developer.android.com/reference/java/io/Serializable.html

この説明がお役に立てば幸いです。

于 2012-07-27T10:32:26.393 に答える