【发布时间】:2016-04-11 14:53:00
【问题描述】:
我有一个微调器,可以在下拉列表中加载客户的姓名。
微调器从 JSON 数组中获取字符串。 我还有一些文本视图,当微调器选择更改时,应加载所选客户的姓名、地址、电话号码。
但是 JSONArray 在另一个类中使用,如何在另一个类中使用 JSONArray?(当微调器选择发生变化时,如何加载正确的客户详细信息?)
这是我的代码:
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) {
}
}
}
这就是 jsonObj 的样子:
{
"Successful": true,
"Value": [
{
"Naam": "Google",
"Adres": "Kerkstraat 3",
"Postcode": "4455 AK Roosendaal",
"Telefoon": "0165-559234",
"Email": "info@google.nl",
"Website": "www.google.nl"
},
{
"Naam": "Apple",
"Adres": "Kerkstraat 4",
"Postcode": "4455 AD Roosendaal",
"Telefoon": "0164-559234",
"Email": "info@apple.nl",
"Website": "www.apple.nl"
}
]
}
(只有 2 个“客户”,因为它是虚拟数据)
【问题讨论】:
-
您想将
spinnerArray发送到其他活动吗? -
如果您的客户太多,我建议您创建一个数据库并将条目保存到其中。您可以使用 3rd 方库来简化工作,例如:greendao-orm.com 或 ormlite.com/sqlite_java_android_orm.shtml
-
我已经从 webAPI 获取了这个 JSON 数组(它从数据库中获取数据)
-
好的,所以如果您的应用程序应该离线工作。我发现最好的方法是“重新创建”与网络上的数据库相同的数据库并在您的应用程序中使用它。数据将是整体可访问的,并且使用 ORM 库,您无需手动解析对象等。