如何重用来自在onPostExecute中获取数据的JSONArray中的数据

时间:2014-08-13 09:38:23

标签: android eclipse

这是我将数据从PHP站点导入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代码,所以除了我的问题之外,这个代码可能会变得更好。

我想要做的是显示所有数据,很好,这是从网站上获得的。但是,由于ListView不能包含ID和其他数据,我想知道我是否可以重用JSONObject中的数据以显示在下一个屏幕中(点击ListView项目)?

提前问候和致谢,

戴维

3 个答案:

答案 0 :(得分:0)

你可以

  • 保存JSON并稍后再次解析它(你必须进行大量的解析)
  • 保存您从json解析的数据
    • in sharedpreferences(仅限少量数据)
    • 在本地sqlite数据库中(可能是最干净的方法,具有最佳用户体验,但由于您必须创建一个执行所有数据库CRUD操作的类,所以需要做很多工作)

这取决于您的数据。对于用户首选项,我会使用SharedPreferences,对于较大数量的本地数据库。您还可以创建一些对象来存储您需要的数据,可能作为符号或其他内容,并在每次启动应用程序时解析存储的JSON。

请参阅the google docs on data storage以供参考。

答案 1 :(得分:0)

创建要存储信息的变量并循环遍历JsonArray并获取每个JsonObject并解析/提取所需的信息并将其存储在变量中。

这里是迭代JsonArray的示例代码//这里的响应是JsonArray

创建像

这样的简单类
 public class PersonInfo{

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


   //Add Getter Setter Methods for these variables

  }

// 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值。 这只是示例代码。

答案 2 :(得分:-1)

要保存您在后台任务中获得的数据,您必须使用共享首选项。

请参阅this link以获取有关共享偏好设置的详细信息。

要将数据传递到下一页,您必须使用以下代码:

Intent intent = new Intent( currentActivity.this, NextActivity.class);
intent.putExtra("key", "value");
startActivity(intent);

在nextActivity.java上,在onCreate()

中添加以下代码
Intent currentPageIntent = getIntent();
String strValue = currentPageIntent.getStringExtra("key");

如果您有任何其他数据类型而不是字符串,则必须使用其他方法而不是getStringExtra()

要获取单击项目的ID,您可以使用以下代码:

list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            try {
                JSONArray jsonArray = new JSONArray(jsonData);                  

                if (jsonArray != null) {
                    for (int i = 0; i < jsonArray.length(); i++) {
                        if (i == id) {
                            //Add your code here
                        }
                    }
                }

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

请注意,您必须自己处理jsonData。这只是我在其中一个项目中使用的示例代码。