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

相关问题