如何重用从JSONArray这onPostExecute得到了数据的数据 [英] How to reuse data from a JSONArray which got data in onPostExecute

查看:182
本文介绍了如何重用从JSONArray这onPostExecute得到了数据的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的code从一个PHP的网站获取数据到一个ListView。

this is my code for getting data from a PHP site into a ListView.

package be.pressd.arrangementen;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
    Button fetch;
    EditText et;
    String aantalPersonen; 

    private ListView lv;  
    private ArrayAdapter<String> listAdapter ; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fetch = (Button) findViewById(R.id.fetchButton);
        et = (EditText) findViewById(R.id.aantalPersonen);

        // Find the ListView resource.     
        lv = (ListView) findViewById(R.id.arrangementenLijst);   
        listAdapter = new ArrayAdapter<String>(this, R.layout.line_row);  

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //Toast.makeText(getApplicationContext(), "Click nummer " + position, Toast.LENGTH_LONG).show();
                String arrangement = (String) lv.getItemAtPosition(position);

                // Launching new Activity on selecting single List Item
                Intent i = new Intent(getApplicationContext(), ArrangementItem.class);

                // sending data to new activity
                i.putExtra("arrangement", arrangement);
                startActivity(i);
            }

        });

        fetch.setOnClickListener(this);
    }

    class task extends AsyncTask<String, String, Void>
    {
        private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
        InputStream is = null ;
        String result = "";


        protected void onPreExecute() {
            progressDialog.setMessage("Fetching data...");
            progressDialog.show();
            progressDialog.setOnCancelListener(new OnCancelListener() {

                @Override
                public void onCancel(DialogInterface arg0) {
                    task.this.cancel(true);
                }
            });
        }

        @Override
        protected Void doInBackground(String... params) {

            String url_select = "http://mywebsite/thephpform.php?aantpers=" + aantalPersonen;

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url_select);

            ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

            try 
            {
                httpPost.setEntity(new UrlEncodedFormEntity(param));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();

                //read content
                is =  httpEntity.getContent();                  

            } catch (Exception e) {

                Log.e("log_tag", "Error in http connection "+e.toString());
            }

            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();

                String line = "";

                while((line=br.readLine())!=null)
                {
                    sb.append(line+"\n");
                }

                is.close();
                result=sb.toString();               

            } catch (Exception e) {

                Log.e("log_tag", "Error converting result "+e.toString());
            }
            return null;
        }

        protected void onPostExecute(Void v) {

            try 
            {   listAdapter.clear();
                JSONArray Jarray = new JSONArray(result);

                for(int i=0; i < Jarray.length(); i++)
                {
                    JSONObject Jasonobject = null;
                    Jasonobject = Jarray.getJSONObject(i);

                    String name = Jasonobject.getString("naam");

                    listAdapter.add(name);
                }
                this.progressDialog.dismiss();

                lv.setAdapter( listAdapter);

            } catch (Exception e) {

                Log.e("log_tag", "Error parsing data "+e.toString());
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.fetchButton :

                aantalPersonen = et.getText().toString();
                if (aantalPersonen.trim().equals("")) {
                    Toast.makeText(this, "Gelieve het aantal personen in te geven", Toast.LENGTH_SHORT).show();
                    return;
                }
                else 
                {
                        new task().execute();
                        break;
                }       
        }
    }
}

这是我的第一款Android code如初,所以除了我的问题有可能是这个code可以变得更好。

It is my first Android code ever, so besides my question it is possible that this code can be made better.

我想这样做是显示所有数据,很好,这是从网站上得到。但是,作为一个ListView不能包含ID和其他数据,我想知道如果我可以重复使用的JSONObject的数据在下一屏中显示(在ListView项的点击)?

What I would like to do is to show ALL data, nicely, which was gotten from the website. But, as a ListView can not contain the ID and other data, I'm wondering if I can reuse the data in the JSONObject to be shown in next screen (on click of ListView item) ?

问候和感谢提前,

戴维

推荐答案

创建您希望通过JsonArray存储信息和回路,并得到各的JSONObject和解析/提取所需信息,并将其存储在变量变数。

Create variables for which you want to store information and loop through JsonArray and get each JsonObject and parse/extract information that you need and store it in variables.

下面是样本code遍历JsonArray //这里的反应是JsonArray

here is sample code to iterate JsonArray //Here response is JsonArray

创建像

 public class PersonInfo{

   String name,address; //Create variables of your requirement.


   //Add Getter Setter Methods for these variables

  }

//类PersonInfo结束

//End of class PersonInfo

  ArrayList<PersonInfo> persons = new ArrayList<PersonInfo>();
  PersonInfo person;
  JSONObject product;


  try
   {
      for (int j = 0; j < response.length(); j++)
       {
          person = new Person();


          product = response.getJSONObject(j);

          person.name =  product.getString("JSON_KEY_NAME"); //like these assign values to each variable of PersonInfo class
          //Other values initialization
       }

     persons.add(person); // Add PersonInfo object to ArrayList        

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

类似的东西。

您可以根据您的质量要求得到的JSON值。
这仅仅是样品code。

you can get json values upon your requirments. This is just sample code .

这篇关于如何重用从JSONArray这onPostExecute得到了数据的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆