2016-01-07 25 views
9

Ich habe einen Spinner, der den Namen der Kunden in das Dropdown lädt.Verwenden Sie JSONArray in einer anderen Klasse?

Der Spinner ruft die Zeichenfolge aus einem JSON-Array ab. Ich habe auch ein paar Textviews, wo der Name, die Adresse, die Telefonnummer des ausgewählten Kunden geladen werden sollte, wenn sich die Auswahl der Spinner ändert. ?

Aber die JSONArray ist in einer anderen Klasse verwendet wird, wie kann ich die JSONArray in einer anderen Klasse verwenden (Wie kann ich die richtigen Kundendaten laden, wenn Spinner Auswahl ändert?)

Das ist mein Code:

 public class Gegevens extends Main { 

      Spinner spCustomers; 


      private JSONObject jsonChildNode; 
      private JSONArray jsonMainNode; 
      private String name; 
      private TextView txtNaam; 
      private TextView txtAdres; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_gegevens); 
       new AsyncLoadCustDetails().execute(); 
       spCustomers = (Spinner) findViewById(R.id.spKlanten); 
       spCustomers.setOnItemSelectedListener(new mySelectedListener()); 
       txtNaam = (TextView)findViewById(R.id.txtNaam); 



      } 


      protected class AsyncLoadCustDetails extends 
        AsyncTask<Void, JSONObject, ArrayList<String>> { 
       ArrayList<CustomerDetailsTable> custTable = null; 

       @Override 
       protected ArrayList<String> doInBackground(Void... params) { 

        RestAPI api = new RestAPI(); 
        ArrayList<String> spinnerArray = null; 
        try { 

         JSONObject jsonObj = api.GetCustomerDetails(); 

         JSONParser parser = new JSONParser(); 

         custTable = parser.parseCustomerDetails(jsonObj); 
         spinnerArray = new ArrayList<String>(); 
//All i can think of is make new array for each value? 

         Log.d("Customers: ", jsonObj.toString()); 
         jsonMainNode = jsonObj.optJSONArray("Value"); 
         for (int i = 0; i < jsonMainNode.length(); i++) { 
          jsonChildNode = jsonMainNode.getJSONObject(i); 
          name = jsonChildNode.optString("Naam"); 


          spinnerArray.add(name); 
         } 


        } catch (Exception e) { 
         Log.d("AsyncLoadCustDetails", e.getMessage()); 

        } 

        return spinnerArray; 
       } 

       @Override 
       protected void onPostExecute(ArrayList<String> spinnerArray) { 
        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.spinner_item, spinnerArray); 
        spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item); // The drop down view 
        spCustomers.setAdapter(spinnerArrayAdapter); 

       } 



      } 

      public class mySelectedListener implements AdapterView.OnItemSelectedListener { 

       @Override 
       public void onItemSelected(AdapterView parent, View view, int pos, long id) { 



        String value = (String) parent.getItemAtPosition(pos); 
        txtNaam.setText(value); //got the name working since it wasnt that hard 
    //load the other details in the textviews 

       } 

       @Override 
       public void onNothingSelected(AdapterView parent) { 
       } 

      } 
     } 

Dies ist, was die jsonObj wie folgt aussieht:

{ 
    "Successful": true, 
    "Value": [ 
    { 
     "Naam": "Google", 
     "Adres": "Kerkstraat 3", 
     "Postcode": "4455 AK Roosendaal", 
     "Telefoon": "0165-559234", 
     "Email": "[email protected]", 
     "Website": "www.google.nl" 
    }, 
    { 
     "Naam": "Apple", 
     "Adres": "Kerkstraat 4", 
     "Postcode": "4455 AD Roosendaal", 
     "Telefoon": "0164-559234", 
     "Email": "[email protected]", 
     "Website": "www.apple.nl" 
    } 
    ] 
} 

(Nur 2 "Kunden", da seine Dummy-Daten)

+0

Sie möchten 'spinnerArray' an andere Aktivitäten senden? –

+0

Wenn Sie zu viele Kunden haben, empfehle ich, eine Datenbank zu erstellen und die Einträge zu speichern. Sie können Bibliotheken von Drittanbietern verwenden, um die Arbeit zu vereinfachen: http://greendao-orm.com oder http://ormlite.com/sqlite_java_android_orm.shtml – MoQ93

+0

Ich erhalte dieses JSON-Array bereits von einer webAPI (die bekommt die Daten aus einer Datenbank) – Yoshi

Antwort

5

Sie können die JsonArray bespannen wie folgt konvertieren:

String jsonString = jsonArray.toString(); 

speichern es in gemeinsamen Vorlieben:

    SharedPreferences settings = getSharedPreferences(
          "pref", 0); 
        SharedPreferences.Editor editor = settings.edit(); 
        editor.putString("jsonString", jsonString); 
        editor.commit(); 

Und es dann in anderen Klasse zugreifen.

SharedPreferences settings = getSharedPreferences(
          "pref", 0); 
        String jsonString= settings 
          .getString("jsonString", null); 

Sobald Sie den String erhalten hat, wandelt es in JsonArray zurück:

JsonArray jsonArray = new JsonArray(jsonString); 
+0

Danke, einfache Lösung. – Yoshi

1

Sie Ihre json in einer Datei speichern und dann in einer anderen Klasse abrufen kann oder überall so:

zu handhaben

Klasse speichern und Abrufen von Daten:

public class RetriveandSaveJSONdatafromfile { 

public static String objectToFile(Object object) throws IOException { 
     String path = Environment.getExternalStorageDirectory() + File.separator + "/AppName/App_cache" + File.separator; 
     File dir = new File(path); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
     } 
     path += "data"; 
     File data = new File(path); 
     if (!data.createNewFile()) { 
      data.delete(); 
      data.createNewFile(); 
     } 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data)); 
     objectOutputStream.writeObject(object); 
     objectOutputStream.close(); 
     return path; 
    } 

    public static Object objectFromFile(String path) throws IOException, ClassNotFoundException { 
     Object object = null; 
     File data = new File(path); 
     if(data.exists()) { 
      ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data)); 
      object = objectInputStream.readObject(); 
      objectInputStream.close(); 
     } 
     return object; 
    } 
} 

um json in einer Datei zu speichern uns e RetriveandSaveJSONdatafromfile.objectToFile(obj) und Daten aus der Datei

path = Environment.getExternalStorageDirectory() + File.separator + 
"/AppName/App_cache/data" + File.separator; 
RetriveandSaveJSONdatafromfile.objectFromFile(path); 
5

verwenden zu holen Wenn Sie über verschiedene Komponenten verwenden möchten, ist eine weitere Option Parcel Schnittstelle zu verwenden.Das Folgende ist eine Pojo Klasse mit Elementen Namen und job_title, die als Objekt gemacht hat, die über Absichten geleitet werden kann Schnittstelle Parcel

public class ContactPojo implements Parcelable{ 
     private String name; 
     private String job_title; 
     public void setName(String name) { 
     this.name = name; 
     } 

     public void setJob_title(String job_title) { 
     this.job_title = job_title; 
     } 
    public String getName() { 
     return name; 
    } 

    public String getJob_title() { 
     return job_title; 
    } 
    private ContactPojo(Parcel parcel){ 
     name=parcel.readString(); 
     job_title=parcel.readString(); 
    } 
    @Override 
    public int describeContents() { 
     return 0; 
    } 
    @Override 
    public void writeToParcel(Parcel parcel, int flags) { 
     parcel.writeString(name); 
     parcel.writeString(job_title); 
    } 
public static final Parcelable.Creator<ContactPojo> CREATOR = new 
      Parcelable.Creator<ContactPojo>() { 
       public ContactPojo createFromParcel(Parcel in) { 
        return new ContactPojo(in); 
       } 

       public ContactPojo[] newArray(int size) { 
        return new ContactPojo[size]; 
    }}; 
} 

Sie können die pojo Klasse füllen, indem das tun die folgende

ContactPojo contactPojo= new ContactPojo(); 
contactPojo.setName("name"); 
contactPojo.setJob_title("name"); 

und es ext Absicht sendet diese

Intent intent=new Intent(this, DetailView.class); 
intent.putExtra("Data", contactPojo); 

Abrufen der Daten in der nächsten Absicht durch die nächsten Schritte

ContactPojo contactPojo=new ContactPojo(); 
contactPojo=getIntent().getParcelableExtra("Data"); 
Log.i(AppConstants.APPUILOG, "Name: " + contactPojo.getName()); 
1

1) Sie intsance der anderen Klasse in Ihrem mainactivity erhalten können und die JSON-Daten als String Antwort

2) passieren Verwenden Broadcast Zuhörer und Service. Schreiben Sie Ihre json-Antwort in einen Dienst und senden Sie sie mit einer Broadcast-Absicht an die Hauptaktivität zurück. Der Broadcast-Empfänger in Ihrer Hauptaktivität kann den Dienst mit den JSON-Daten hören. Aktualisieren Sie auch die Textansichten.

Verwandte Themen