2017-10-21 15 views
0

ここでは、jsonを使用して1つのテキストビューで複数の行の値を取得するために複数回試みたコードを示します。複数の行のデータを1つのテキストビューで表示します。

protected Void doInBackground(Void... arg0) 
     { 

      HttpClient myClient = new DefaultHttpClient(); 
      HttpPost myConnection = new HttpPost("http://192.168.1.5/send-data.php"); 

      try { 
       response = myClient.execute(myConnection); 
       str = EntityUtils.toString(response.getEntity(), "UTF-8"); 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      try{ 
       JSONArray jArray = new JSONArray(str); 

       for(int i=0; i <jArray.length(); i++) { 
        json = jArray.getJSONObject(i); 

       } 


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

      catch (Exception e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     protected void onPostExecute(Void result) 
     { 
      try { 
       textview.setText(json.getString("survey_textresponse")); 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      //Hiding progress bar after done loading TextView. 
      progressbar.setVisibility(View.GONE); 

     } 
    } 


} 

私はchromeで直接phpファイルを実行すると、データベースからのすべての値を表示し、アンドロイドアプリケーションでは最初の行の値のみを表示します。

答えて

1

JSONArrayから値を取得するために作成したループは適切ではありません。ループを反復しながら最後のオブジェクトのみを格納します。取得した値を文字列のコレクションに格納することができます。ここ はあなたが従うことができるサンプルコードです:

private class RetrieveTask extends AsyncTask<Void,Void,Void>{ 
    List<String> jsonResults; 
    String str; 
    JSONObject json; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     jsonResults=new ArrayList<>(); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     for(String data:jsonResults) 
      textview.append(data); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     HttpClient myClient = new DefaultHttpClient(); 
     HttpPost myConnection = new HttpPost("http://192.168.1.5/send-data.php"); 

     try { 
      response = myClient.execute(myConnection); 
      str = EntityUtils.toString(response.getEntity(), "UTF-8"); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     try{ 
      JSONArray jArray = new JSONArray(str); 

      for(int i=0; i <jArray.length(); i++) { 
       json = jArray.getJSONObject(i); 
       if(json.optString("survey_textresponse")!=null){ 
        jsonResults.add(json.getString("survey_textresponse")); 
       } 
      } 


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

     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
+0

私はtextviewを追加しました。 setText(........ onPostExecuteメソッド内では.......)。 –

+0

私は、指定したコードでonPostExecuteメソッドにこの行を追加したところ、魔法のように動作するようになったので、textviewはすべての行データを表示しています –

+0

** setText(..)**を使用してすべての行をポストすると、リスト内の値をループするとTextViewのテキストが上書きされ、setText(..)を使用して追加されない可能性があります。 –

2

あなただけの値

  • コレクトのリストとしてこの

    • 収集データにjson参照して

      // assume JArray length = 5 
      for(int i=0; i <jArray.length(); i++) { 
          json = jArray.getJSONObject(i); 
          // only have last object value , in last iteration jArray.getJSONObject(4) 
      } 
      

      が存在することができ、多くのソリューションをJSONobjectの最後の値を格納しているのでStringまたはStringBuilderオブジェクトの場合

    StringBuilder sb = new StringBuilder(); 
    // or List<String> list = new ArrayList<>(); 
    
    for(int i=0; i <jArray.length(); i++) { 
        json = jArray.getJSONObject(i); 
        sb.append(json.optString("survey_textresponse")+"\n"); 
        // or list.add(json.optString("survey_textresponse")); 
    } 
    

    以降

    textview.setText(sb.toString()); 
    // or can collect list as string using loop and display it 
    
  • +0

    pavneet_singh先生、それはどのようにJSONオブジェクトのすべてをループすることができ、それますが、唯一の最後の値を移入されましたか? –

    +0

    @KamranAshiq私が答えて言ったように、あなたはループしているだけですが、ループしながらデータを収集しなければならないので、データを収集するために 'sb.append'や' list'のようなソリューションを使うことができます。あなたのjsonレスポンスを投稿してください –

    +0

    Pavneet_singhありがとうございました。 –

    1

    あなたjson変数は、それが終了しJsonArrayの唯一の最後の要素が含まれています。 JsonArrayから値を取得しながらTextViewに表示することができます。

    for(int i=0; i <jArray.length(); i++) { 
         json = jArray.getJSONObject(i); 
         textview.setText(textview.getText() + json.getString("survey_textresponse") + "\n"); 
    } 
    
    +3

    あなたのコードはクラッシュするでしょう。あなたは 'doInBackground'からUIを更新できません。 –

    +0

    私はtextview.setText(........ onPostExecuteメソッドでそれを追加しました..それは働いています.. –

    関連する問題