2017-10-21 75 views
0

這是我多次嘗試使用json在單個文本視圖中獲取多行值的代碼。在單個文本視圖中的多行數據android

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文件時,它顯示數據庫中的所有值,而在android應用程序中它只顯示第一行值。

回答

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

因爲你只

// 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的最後一個值json參照本

  • 收集數據的值

  • 收集的名單在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只有最後一個元素。您可以在TextView上顯示,同時從JsonArray中檢索您的值。

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方法中,它的工作.. –

相關問題