简体   繁体   English

在TextView上打印数组值(Android)

[英]Printing array values on a textview (android)

I'm trying to print The destination addresses & their distances from the origin in the textView. 我正在尝试在textView中打印目标地址及其与原点的距离。 However, I keep getting error or just show the last value. 但是,我总是收到错误消息或仅显示最后一个值。 I don't want the text view get updated, I want the new value to be printed under the new one Here is my code 我不想更新文本视图,我想在新值下打印新值,这是我的代码

public class MainActivity extends Activity {
        private static final String TAG_ROWS = "rows";
    private static final String TAG_ELEMENTS = "elements";
    private static final String TAG_DISTANCE = "distance";
    private static final String TAG_VALUE = "value";
    private static final String TAG_ADDRESS = "destination_addresses";
    String Addresses[]= {"2906+west+Broadway+Vancouver+BC","4750+Kingsway+Burnaby+BC","2633+Sweden+Way+110+Richmond","943+Marine+Dr+North+Vancouver","4567+Lougheed+Hwy+Burnaby"};

    String data;
    HttpClient client;
    double minDistance=0;
    static JSONObject jObj = null;
    String destination_addresses;
    JSONArray rows;
    String destination;
    String distanceStr;
    String[] value_destination;
    String value;
    final static String URL= "http://maps.googleapis.com/maps/api/distancematrix/json?";
    TextView result;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                result = (TextView) findViewById(R.id.text1);
                result.setText("Distace from the location" + destination + " is :" + distanceStr );

          new TestGoogleMaps().execute("");

        }
        public class TestGoogleMaps extends AsyncTask<String, Void, String>{
                @Override
                protected String doInBackground(String... params) {
                        // TODO Auto-generated method stub
                        try {
                    try {
                        ClosestObject();
                    } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                finally {

                }
                        return null;
                }
                @Override
                protected void onPostExecute(String resuls) {
                        // TODO Auto-generated method stub
                        super.onPostExecute(resuls);
                 }
        }
        public void ClosestObject() throws JSONException, ClientProtocolException, IOException {

        // Creating JSON Parser instance
    StringBuilder url = new StringBuilder(URL);
    client=new DefaultHttpClient();
    for (int index=0; index<Addresses.length; index++){
    String str_parameters = "origins="+ URLEncoder.encode("1359+Richards+Street+Vancouver+BC","UTF-8")+"&destinations="+ URLEncoder.encode(Addresses[index],"UTF-8")+"&mode=driving&language="+ URLEncoder.encode("en-FR","UTF-8")+"&sensor=false";
    System.out.println("URL URl :: "+url+str_parameters);
   HttpGet get = new HttpGet(url+str_parameters);
   get.setHeader("Accept", "application/json");
   get.setHeader("Content-type", "application/json");
    HttpResponse r = client.execute(get);
    HttpEntity en = r.getEntity();
    data = EntityUtils.toString(en);
   System.out.println("ClosestObject Response :: "+data);


    try {
           jObj = new JSONObject(data);

            destination = jObj.getString("destination_addresses");
            // printing the destination and checking wheather parsed correctly
            Log.v("Destination", destination);

            JSONArray jarRow = jObj.getJSONArray("rows");
            for(int i=0;i<jarRow.length(); i++){
                // creating an object first
                JSONObject ElementsObj = jarRow.getJSONObject(i);
                // and getting the array out of the object
                JSONArray jarElements = ElementsObj.getJSONArray("elements");
                for(int j=0; j<jarElements.length(); j++){
                    JSONObject distanceObj = jarElements.getJSONObject(j).getJSONObject("distance");
                    distanceStr = distanceObj.getString("value");
                    Log.v("finally getting distance : ", distanceStr);

                }           }

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

        }     

        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

}

How can I print all the members on my TextView? 如何在TextView上打印所有成员?

I want the new value to be printed under the new one 我希望将新值打印在新值下

So if you want to print your all destinations into TextView most efficient way will be to use for example StringBuffer to create whole String that will be finally assigned to your TextView. 因此,如果要将所有目标打印到TextView最有效的方法是使用例如StringBuffer创建完整的String,该字符串最终将分配给TextView。

I recommend you change your return type of ClosestObject method to StringBuffer(or Builder) and in your loop append data to it. 我建议您将ClosestObject方法的返回类型更改为StringBuffer(或Builder),并在循环中向其追加数据。 Also change third parameter of AsyncTask to StringBuffer. 还将AsyncTask的第三个参数更改为StringBuffer。

Pseudo-code: 伪代码:

@Override
protected StringBuffer doInBackround() {
    ...
    StringBuffer buff = ClosestObject();
    return buff;
}

In your ClosestObject method: 在您的ClosestObject方法中:

StringBuffer buff = new StringBuffer();
for (int i = 0; i < arr.length(); i++) {
   // getting values from JSON
   buff.append(value).append("\n"); // buff.append(value1 + "," + value2 + "\n")
}
...
return buff;

and finally update your TextView from onPostExecute() method that already runs on UI Thread and allows updates. 最后从已经在UI Thread上运行并允许更新的onPostExecute()方法更新TextView

yourTextView.setText(result.toString());

Note: 注意:

Don't forget that by naming conventions in Java, method's signature should start with lowercase letter and not with uppercase. 不要忘记,通过使用Java命名约定,方法的签名应以小写字母开头,而不应以大写字母开头。

Try this: 尝试这个:

MainActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        result.setText(result.getText().toString() + "\n" + distanceStr);
    }
});

You must update the TextView on the UI Thread as shown because the JSON response is received in a different Thread from your AsyncTask , otherwise you will receive a CalledFromTheWrongThreadException . 您必须如图所示更新UI线程上的TextView ,因为JSON响应是从与AsyncTask不同的线程中接收到的,否则将收到CalledFromTheWrongThreadException

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM