【发布时间】:2018-07-30 19:30:55
【问题描述】:
我有来自 web 服务的 json 数据,应该存储在两个列表中,字符串列表和整数列表。用于字符串的那个可以很好地存储数据,但用于整数的那个不能。它提示错误说 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
这里是完整的代码
public class Setup extends AppCompatActivity {
Button save;
EditText schoolPK;
String schoolname, classname, cityname, school_id,class_id;
ImageView logout;
GridView grid;
String cityid,classid;
int schoolid;
ArrayList<String> CityName, CityId;
private List<Integer> classID=new ArrayList<Integer>();
private List<String> listschools = new ArrayList<String>();
private List<String> listclasses = new ArrayList<String>();
Spinner schoolspinner;
public static final String MyPREFERENCES = "MyPrefs" ;
public static final String classnames = "classname";
public static final String schoolnames = "schoolname";
public static final String Email = "emailKey";
SharedPreferences sharedpreferences;
String saved_letter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.setup2);
CityName=new ArrayList<>();
CityId = new ArrayList<>();
//classID = new ArrayList<>();
// schoolID = new ArrayList<>();
schoolPK = (EditText) findViewById(R.id.schoolPK);
final Spinner city = (Spinner) findViewById(R.id.city);
final Spinner classspinner = (Spinner) findViewById(R.id.classname);
String URL_countries="http://192.168.0.148/Election/api/school";
JsonArrayRequest items = new JsonArrayRequest(URL_countries, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0;i<response.length();i++){
try {
JSONObject obj = response.getJSONObject(i);
String country=obj.getString("name_Ar");
String cityid = obj.getString("pK_ID");
CityId.add(cityid);
CityName.add(country);
}
catch (JSONException e) {
e.printStackTrace();
}
city.setAdapter(new ArrayAdapter<String>(Setup.this, android.R.layout.select_dialog_item, CityName));
}
//to get me the
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
AlertDialog.Builder add = new AlertDialog.Builder(Setup.this);
add.setMessage(error.getMessage()).setCancelable(true);
AlertDialog alert = add.create();
alert.setTitle("error");
alert.show();
}
} );
Controller.getInstance(Setup.this).addToRequestque(items);
city.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
cityname = parent.getItemAtPosition(position).toString();
cityid = CityId.get(position).toString();
//CityId.clear();
listclasses.clear();
getclasses();
} // to close the onItemSelected
public void onNothingSelected(AdapterView<?> parent) {
}
});
classspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
classname = parent.getItemAtPosition(position).toString();
class_id = classID.get(position).toString();
}
// to close the onItemSelected
public void onNothingSelected(AdapterView<?> parent) {
}
});
save = (Button) findViewById(R.id.save);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sharedpreferences = getSharedPreferences("Settings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
Intent intent = new Intent(getApplicationContext(), Vote.class);
editor.putString("schoolname", cityname);
editor.putString("schoolid", cityid);
editor.putString("classname", classname);
editor.putString("classid", class_id);
editor.apply();
}
});
}
public void getschools(){
try {
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
String URL = "http://192.168.0.148/Election/api/School";
JSONObject jsonBody = new JSONObject();
// jsonBody.put("tblRegisteredUsers_nickName", username.getText().toString().trim());
jsonBody.put("cityFK_ID", cityid);
final String requestBody = jsonBody.toString();
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//my response later should be changed
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
})
{
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return requestBody == null ? null : requestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
return null;
}
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String responseString;
String json = null;
try {
json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
responseString = String.valueOf(json).trim();
ArrayList<Schoolresponse> list_response = new ArrayList<Schoolresponse>();
Type listType = new TypeToken<List<Schoolresponse>>() {}.getType();
list_response = new Gson().fromJson(responseString, listType);
// schoolID= new ArrayList<>();
for (int i = 0; i < list_response.size(); i++) {
School listItemData = new School();
listItemData.setName(list_response.get(i).getNameAr());
listItemData.setId(list_response.get(i).getPKID());
//schoolID.add(listItemData.getId());
listschools.add(listItemData.getName());
}
// i should have this piece of code for methods that are running in the background
runOnUiThread(new Runnable() {
@Override
public void run() {
schoolspinner.setAdapter(new ArrayAdapter<String>(Setup.this, android.R.layout.select_dialog_item, listschools));
}
});
return Response.success(list_response.toString(), HttpHeaderParser.parseCacheHeaders(response));
}
};
requestQueue.add(stringRequest);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
public void getclasses(){
final Spinner classspinner = (Spinner) findViewById(R.id.classname);
try {
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
String URL = "http://192.168.0.148/Election/api/classes";
JSONObject jsonBody = new JSONObject();
// jsonBody.put("tblRegisteredUsers_nickName", username.getText().toString().trim());
jsonBody.put("SchoolFK_ID", cityid);
final String requestBody = jsonBody.toString();
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//my response later should be changed
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
})
{
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return requestBody == null ? null : requestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
return null;
}
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String responseString;
String json = null;
try {
json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
responseString = String.valueOf(json).trim();
ArrayList<ClassResponse> list_response = new ArrayList<ClassResponse>();
Type listType = new TypeToken<List<ClassResponse>>() {}.getType();
list_response = new Gson().fromJson(responseString, listType);
for (int i = 0; i < list_response.size(); i++) {
School listItemData = new School();
listItemData.setName(list_response.get(i).getNameAr());
listItemData.setId(list_response.get(i).getPKID());
classID.add(listItemData.getId());
listclasses.add(listItemData.getName());
}
// i should have this piece of code for methods that are running in the background
runOnUiThread(new Runnable() {
@Override
public void run() {
classspinner.setAdapter(new ArrayAdapter<String>(Setup.this, android.R.layout.select_dialog_item, listclasses));
}
});
// String Check = yourModel.getMessagetitle();
return Response.success(list_response.toString(), HttpHeaderParser.parseCacheHeaders(response));
}
};
requestQueue.add(stringRequest);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
这就是我所说的区域 其中只有字符串列表 (listclasses) 存储数据,而整数 (classID) 列表不存储数据
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String responseString;
String json = null;
try {
json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
responseString = String.valueOf(json).trim();
ArrayList<ClassResponse> list_response = new ArrayList<ClassResponse>();
Type listType = new TypeToken<List<ClassResponse>>() {}.getType();
list_response = new Gson().fromJson(responseString, listType);
for (int i = 0; i < list_response.size(); i++) {
School listItemData = new School();
listItemData.setName(list_response.get(i).getNameAr());
listItemData.setId(list_response.get(i).getPKID());
classID.add(listItemData.getId());
listclasses.add(listItemData.getName());
}
// i should have this piece of code for methods that are running in the background
runOnUiThread(new Runnable() {
@Override
public void run() {
classspinner.setAdapter(new ArrayAdapter<String>(Setup.this, android.R.layout.select_dialog_item, listclasses));
}
});
// String Check = yourModel.getMessagetitle();
return Response.success(list_response.toString(), HttpHeaderParser.parseCacheHeaders(response));
}
};
希望我得到正确的答案 在此先感谢
【问题讨论】:
-
嗨,艾哈迈德,您能分享一下 json 响应吗?您是否交叉验证过,如果响应具有您正在寻找的正确标签名称的整数?
-
stackoverflow.com/users/1075657/sudhin-philip { “pK_ID”:5657,“name_En”:“صف 1”,“name_Ar”:“صف 1”,“fkiD_VotingCenter”:10006,“字母”:“ا”, "isActive": true, "entryDate": null, "enteredBy": null, "updateDate": null, "updatedBy": null },
-
json 没有问题,我正在使用 pojo https://stackoverflow.com/users/1075657/sudhin-philip
标签: android list gson indexoutofboundsexception