2016-10-03 8 views
0

私の目的は文字列値を半分に分割して2つの異なるTextViewに配置することです。 UIコンポーネントはArrayAdapterによって処理されますが、これは必須ではありません。2つのTextViewsの間でJSON文字列を分割する

これは私のターゲットUIです:

enter image description here

これまでのところ、私はJSONレスポンスを処理するためのJavaクラスを得ました。私は実際にUSGSからデータを抽出する前に、この機能を動作させようとしています。

public class QueryUtils { 

    private static final String SAMPLE_JSON_RESPONSE = "{\"type\":\"FeatureCollection\",\"metadata\":{\"generated\":1462295443000,\"url\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-01-31&minmag=6&limit=10\",\"title\":\"USGS Earthquakes\",\"status\":200,\"api\":\"1.5.2\",\"limit\":10,\"offset\":1,\"count\":10},\"features\":[{\"type\":\"Feature\",\"properties\":{\"mag\":7.2,\"place\":\"88km N of Yelizovo, Russia\",\"time\":1454124312220,\"updated\":1460674294040,\"tz\":720,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us20004vvx\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us20004vvx&format=geojson\",\"felt\":2,\"cdi\":3.4,\"mmi\":5.82,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":798,\"net\":\"us\",\"code\":\"20004vvx\",\"ids\":\",at00o1qxho,pt16030050,us20004vvx,gcmt20160130032510,\",\"sources\":\",at,pt,us,gcmt,\",\"types\":\",cap,dyfi,finite-fault,general-link,general-text,geoserve,impact-link,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":0.958,\"rms\":1.19,\"gap\":17,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 7.2 - 88km N of Yelizovo, Russia\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[158.5463,53.9776,177]},\"id\":\"us20004vvx\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.1,\"place\":\"94km SSE of Taron, Papua New Guinea\",\"time\":1453777820750,\"updated\":1460156775040,\"tz\":600,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us20004uks\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us20004uks&format=geojson\",\"felt\":null,\"cdi\":null,\"mmi\":4.1,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":572,\"net\":\"us\",\"code\":\"20004uks\",\"ids\":\",us20004uks,gcmt20160126031023,\",\"sources\":\",us,gcmt,\",\"types\":\",cap,geoserve,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":1.537,\"rms\":0.74,\"gap\":25,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.1 - 94km SSE of Taron, Papua New Guinea\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[153.2454,-5.2952,26]},\"id\":\"us20004uks\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.3,\"place\":\"50km NNE of Al Hoceima, Morocco\",\"time\":1453695722730,\"updated\":1460156773040,\"tz\":0,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004gy9\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004gy9&format=geojson\",\"felt\":117,\"cdi\":7.2,\"mmi\":5.28,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":0,\"sig\":695,\"net\":\"us\",\"code\":\"10004gy9\",\"ids\":\",us10004gy9,gcmt20160125042203,\",\"sources\":\",us,gcmt,\",\"types\":\",cap,dyfi,geoserve,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":2.201,\"rms\":0.92,\"gap\":20,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.3 - 50km NNE of Al Hoceima, Morocco\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[-3.6818,35.6493,12]},\"id\":\"us10004gy9\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":7.1,\"place\":\"86km E of Old Iliamna, Alaska\",\"time\":1453631430230,\"updated\":1460156770040,\"tz\":-540,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004gqp\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004gqp&format=geojson\",\"felt\":1816,\"cdi\":7.2,\"mmi\":6.6,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":1496,\"net\":\"us\",\"code\":\"10004gqp\",\"ids\":\",at00o1gd6r,us10004gqp,ak12496371,gcmt20160124103030,\",\"sources\":\",at,us,ak,gcmt,\",\"types\":\",cap,dyfi,finite-fault,general-link,general-text,geoserve,impact-link,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,trump-origin,\",\"nst\":null,\"dmin\":0.72,\"rms\":2.11,\"gap\":19,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 7.1 - 86km E of Old Iliamna, Alaska\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[-153.4051,59.6363,129]},\"id\":\"us10004gqp\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.6,\"place\":\"215km SW of Tomatlan, Mexico\",\"time\":1453399617650,\"updated\":1459963829040,\"tz\":-420,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004g4l\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004g4l&format=geojson\",\"felt\":11,\"cdi\":2.7,\"mmi\":3.92,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":673,\"net\":\"us\",\"code\":\"10004g4l\",\"ids\":\",at00o1bebo,pt16021050,us10004g4l,gcmt20160121180659,\",\"sources\":\",at,pt,us,gcmt,\",\"types\":\",cap,dyfi,geoserve,impact-link,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":2.413,\"rms\":0.98,\"gap\":74,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.6 - 215km SW of Tomatlan, Mexico\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[-106.9337,18.8239,10]},\"id\":\"us10004g4l\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.7,\"place\":\"52km SE of Shizunai, Japan\",\"time\":1452741933640,\"updated\":1459304879040,\"tz\":540,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004ebx\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004ebx&format=geojson\",\"felt\":51,\"cdi\":5.8,\"mmi\":6.45,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":720,\"net\":\"us\",\"code\":\"10004ebx\",\"ids\":\",us10004ebx,pt16014050,at00o0xauk,gcmt20160114032534,\",\"sources\":\",us,pt,at,gcmt,\",\"types\":\",associate,cap,dyfi,geoserve,impact-link,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,\",\"nst\":null,\"dmin\":0.281,\"rms\":0.98,\"gap\":22,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.7 - 52km SE of Shizunai, Japan\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[142.781,41.9723,46]},\"id\":\"us10004ebx\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.1,\"place\":\"12km WNW of Charagua, Bolivia\",\"time\":1452741928270,\"updated\":1459304879040,\"tz\":-240,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004ebw\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004ebw&format=geojson\",\"felt\":3,\"cdi\":2.2,\"mmi\":2.21,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":0,\"sig\":573,\"net\":\"us\",\"code\":\"10004ebw\",\"ids\":\",us10004ebw,gcmt20160114032528,\",\"sources\":\",us,gcmt,\",\"types\":\",cap,dyfi,geoserve,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":5.492,\"rms\":1.04,\"gap\":16,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.1 - 12km WNW of Charagua, Bolivia\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[-63.3288,-19.7597,582.56]},\"id\":\"us10004ebw\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.2,\"place\":\"74km NW of Rumoi, Japan\",\"time\":1452532083920,\"updated\":1459304875040,\"tz\":540,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004djn\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004djn&format=geojson\",\"felt\":8,\"cdi\":3.4,\"mmi\":3.74,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":0,\"sig\":594,\"net\":\"us\",\"code\":\"10004djn\",\"ids\":\",us10004djn,gcmt20160111170803,\",\"sources\":\",us,gcmt,\",\"types\":\",cap,dyfi,geoserve,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":1.139,\"rms\":0.96,\"gap\":33,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.2 - 74km NW of Rumoi, Japan\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[141.0867,44.4761,238.81]},\"id\":\"us10004djn\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6.5,\"place\":\"227km SE of Sarangani, Philippines\",\"time\":1452530285900,\"updated\":1459304874040,\"tz\":480,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004dj5\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004dj5&format=geojson\",\"felt\":1,\"cdi\":2.7,\"mmi\":7.5,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":1,\"sig\":650,\"net\":\"us\",\"code\":\"10004dj5\",\"ids\":\",at00o0srjp,pt16011050,us10004dj5,gcmt20160111163807,\",\"sources\":\",at,pt,us,gcmt,\",\"types\":\",cap,dyfi,geoserve,impact-link,impact-text,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,\",\"nst\":null,\"dmin\":3.144,\"rms\":0.72,\"gap\":22,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.5 - 227km SE of Sarangani, Philippines\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[126.8621,3.8965,13]},\"id\":\"us10004dj5\"},\n" + 
      "{\"type\":\"Feature\",\"properties\":{\"mag\":6,\"place\":\"Pacific-Antarctic Ridge\",\"time\":1451986454620,\"updated\":1459202978040,\"tz\":-540,\"url\":\"http://earthquake.usgs.gov/earthquakes/eventpage/us10004bgk\",\"detail\":\"http://earthquake.usgs.gov/fdsnws/event/1/query?eventid=us10004bgk&format=geojson\",\"felt\":0,\"cdi\":1,\"mmi\":0,\"alert\":\"green\",\"status\":\"reviewed\",\"tsunami\":0,\"sig\":554,\"net\":\"us\",\"code\":\"10004bgk\",\"ids\":\",us10004bgk,gcmt20160105093415,\",\"sources\":\",us,gcmt,\",\"types\":\",cap,dyfi,geoserve,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,\",\"nst\":null,\"dmin\":30.75,\"rms\":0.67,\"gap\":71,\"magType\":\"mww\",\"type\":\"earthquake\",\"title\":\"M 6.0 - Pacific-Antarctic Ridge\"},\"geometry\":{\"type\":\"Point\",\"coordinates\":[-136.2603,-54.2906,10]},\"id\":\"us10004bgk\"}],\"bbox\":[-153.4051,-54.2906,10,158.5463,59.6363,582.56]}"; 

    /** 
    * Create a private constructor because no one should ever create a {@link QueryUtils} object. 
    * This class is only meant to hold static variables and methods, which can be accessed 
    * directly from the class name QueryUtils (and an object instance of QueryUtils is not needed). 
    */ 

    private QueryUtils() { 
    } 


    public static ArrayList<Earthquakes> extractEarthquakes() {ArrayList<Earthquakes> earthquakes = new ArrayList<>(); 
     // Try to parse the SAMPLE_JSON_RESPONSE. If there's a problem with the way the JSON 
     // is formatted, a JSONException exception object will be thrown. 
     // Catch the exception so the app doesn't crash, and print the error message to the logs. 
     try { 
      JSONObject baseJsonResponse = new JSONObject(SAMPLE_JSON_RESPONSE); 
      JSONArray earthquakeArray = baseJsonResponse.getJSONArray("features"); 

      String string = SAMPLE_JSON_RESPONSE; 
      String[] parts = string.split("of"); 
      String part1 = parts[0]; // 004 
      String part2 = parts[1]; 

      for (int i = 0; i < earthquakeArray.length(); i++) { 
       JSONObject currentEarthquake = earthquakeArray.getJSONObject(i); 
       JSONObject properties = currentEarthquake.getJSONObject("properties"); 

       long time = properties.getLong("time"); 
       String mag = properties.getString("mag"); 
       String place = properties.getString("place"); 
       String date = properties.getString("time"); 

       earthquakes.add(new Earthquakes(mag,place,time)); 
      } 

     } catch (JSONException e) { 
      // If an error is thrown when executing any of the above statements in the "try" block, 
      // catch the exception here, so the app doesn't crash. Print a log message 
      // with the message from the exception. 
      Log.e("QueryUtils", "Problem parsing the earthquake JSON results", e); 
     } 

     // Return the list of earthquakes 
     return earthquakes; 
    } 

} 

そして、これが私のArrayAdapter

public class EarthquakeAdapter extends ArrayAdapter<Earthquakes> { 
    // 
    // 
    // 

// String A = "of"; 
// boolean decide; 
// 
// decide = baseJsonResponse.contains(A); 

    public EarthquakeAdapter(Context context, List<Earthquakes> earthquakes) { 
     super(context, 0, earthquakes); 
    } 

    private String formatDate(Date dateObject) { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("LLL dd, yyyy"); 
     return dateFormat.format(dateObject); 
    } 

    private String formatTime(Date dateObject) { 
     SimpleDateFormat timeFormat = new SimpleDateFormat("h:mm a"); 
     return timeFormat.format(dateObject); 
    } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // Check if there is an existing list item view (called convertView) that we can reuse, 
      // otherwise, if convertView is null, then inflate a new list item layout. 
      View listItemView = convertView; 
      if (listItemView == null) { 
       listItemView = LayoutInflater.from(getContext()).inflate(
         R.layout.earthquake_list_item, parent, false); 
      } 


//   if (decide == true) 
//   { 
//    System.out.println("Admin mode"); 
//   } 
//   else 
//   { 
//    System.out.println("customer mode"); 
//   } 

      // Find the earthquake at the given position in the list of earthquakes 
      Earthquakes currentEarthquake = getItem(position); 

      TextView quakePosition = (TextView)listItemView.findViewById(R.id.quakePosition); 
      //quakePosition.setText(currentEarthquake.part1); 

      // Find the TextView with view ID magnitude 
      TextView magnitudeView = (TextView) listItemView.findViewById(R.id.magnitude); 
      // Display the magnitude of the current earthquake in that TextView 
      magnitudeView.setText(currentEarthquake.getMagnitude()); 

      // Find the TextView with view ID location 
      TextView locationView = (TextView) listItemView.findViewById(R.id.location); 
      // Display the location of the current earthquake in that TextView 
      locationView.setText(currentEarthquake.getLocation()); 

      // Create a new Date object from the time in milliseconds of the earthquake 
      Date dateObject = new Date(currentEarthquake.getTimeInMilliseconds()); 

      // Find the TextView with view ID date 
      TextView dateView = (TextView) listItemView.findViewById(R.id.date); 
      // Format the date string (i.e. "Mar 3, 1984") 
      String formattedDate = formatDate(dateObject); 
      // Display the date of the current earthquake in that TextView 
      dateView.setText(formattedDate); 

      // Find the TextView with view ID time 
      TextView timeView = (TextView) listItemView.findViewById(R.id.time); 
      // Format the time string (i.e. "4:30PM") 
      String formattedTime = formatTime(dateObject); 
      // Display the time of the current earthquake in that TextView 
      timeView.setText(formattedTime); 

      // Return the list item view that is now showing the appropriate data 
      return listItemView; 
     } 
     } 

あるEarthquakes.java

public class Earthquakes { 
    private String mMagnitude; 
    private String mLocation; 
    private long mTimeInMilliseconds; 

    public Earthquakes(String magnitude, String location, Long timeInMilliseconds){ 
     mMagnitude = magnitude; 
     mLocation = location; 
     mTimeInMilliseconds = timeInMilliseconds; 
    } 

    public String getMagnitude(){ 
     return mMagnitude; 
    } 

    public String getLocation(){ 
     return mLocation; 
    } 

    public long getTimeInMilliseconds() {return mTimeInMilliseconds;} 
    } 

私はここにそれらを掲示する必要性を感じていなかったので、XMLはエラーなしで正しいです。

+0

'String string = SAMPLE_JSON_RESPONSE; String [] parts = string.split( "of"); '完全なJSONを分割して、代わりに各JsonObjectの' place'フィールドを取得します。 – AxelH

+0

私は欲しいフィールドをどのように手に入れますか? –

+0

私はコードの残りの部分を読んでいませんでした。あなたはすでにあなたのループで 'place'を読んでいます。インスタンスを作成しています...どうすれば分割を行うのですか?あなたはすでにそこに完全な文字列を持っています。 – AxelH

答えて

0

アクティビティのJSONの1つの属性を分割したいとします。しかし、あなたはEarthQuakesインスタンスを使用しています。あなたは単にOOを使って作業を行うべきです。

私はあなたがリストを作成していることがわかり

JSONObject properties = currentEarthquake.getJSONObject("properties"); 

long time = properties.getLong("time"); 
String mag = properties.getString("mag"); 
String place = properties.getString("place"); 
String date = properties.getString("time"); 

earthquakes.add(new Earthquakes(mag,place,time)); 

だから、地震が次のようになります。

public class Earthquakes { 
    private String mMagnitude; 
    private String mLocation; 
    private long mTimeInMilliseconds; 

    public Earthquakes(String magnitude, String location, Long timeInMilliseconds){ 
     mMagnitude = magnitude; 
     mLocation = location; 
     mTimeInMilliseconds = timeInMilliseconds; 
    } 

    public String getMagnitude(){ 
     return mMagnitude; 
    } 

    public String getLocation(){ 
     return mLocation; 
    } 

    public long getTimeInMilliseconds() {return mTimeInMilliseconds;} 
    } 

は、あなたがしたい両方の値のための地震にゲッターを追加します。

public String getDistanceFrom(){ return mLocation.split("of")[0]; } 
public String getFrom(){ return mLocation.split("of")[1]; } 

次に、それらをアダプタに使用するだけです。正しい要素のために。

注:リストビューでそれらをたくさん呼び出すので、質問するたびにplaceを分割する代わりに、両方の値をコンストラクター(およびセッター)で作成することができます。

アダプターでは、正しいTextviewのすべての正しいゲッターと値を取得します。

+0

はい、地震のコンストラクタのEarthquakes.java –

+0

....で「場所」が認識されません。ここで2番目の引数はどこに格納されていますか? JSONの 'properties.place'から取得したもの、つまりあなたが取得したコードの' place'という名前のものです。 – AxelH

+0

@OmarOz投稿した回答で質問を編集する必要があります(これは答えではありません)。私は自分の答えを編集して読んでそれをやろうとしますが、これはあなたが望む価値を提供するための基本的なゲッターです...ここでは何も複雑です。 – AxelH

関連する問題