У меня есть spinner
, который ведет себя как a dropdown
в моем android application
. Я разрабатываю приложение в android studio
. Вращатель получает данные из api
. Во время выполнения он получает usernames
от api
и отображается в spinner
. Когда приложение запускается, он показывает username
и ID
выбранного пользователя, как показано на рисунке ниже.
Теперь я хочу добавить подсказку, поэтому я искал много статей и нашел много решений, и я слежу за ними из самых простых. Для лучшего понимания см. Ниже код
try
{
JSONObject jobj = new JSONObject(jsonObject.toString());
// Locate the NodeList name
jsonArray = jobj.getJSONArray("users");
for(int i=0; i<jsonArray.length(); i++)
{
jsonObject = jsonArray.getJSONObject(i);
Users user = new Users();
user.setId(jsonObject.optString("Id"));
user.setName(jsonObject.optString("Name"));
users.add(user);
userList.add("Select a username");// i add this as a hint
userList.add(jsonObject.optString("Name"));
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
Теперь в методе onPostExecute()
@Override
protected void onPostExecute(Void args)
{
// Locate the spinner in activity_main.xml
Spinner spinner = (Spinner)findViewById(R.id.spinner);
// Spinner adapter
spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, userList));
// Spinner on item click listener
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
textViewResult = (TextView)findViewById(R.id.textView);
// Set the text followed by the position
// Set the text followed by the position
if(!users.get(position).getName().equals("Select a username")) {
textViewResult.setText(" " + users.get(position - 1).getName() + " " + users.get(position - 1).getId());
}else {
textViewResult.setText("Hi " + users.get(position).getName() + " your ID is " + users.get(position).getId());
UserId = String.valueOf(users.get(position).getId());
progressDialog.dismiss();
_latitude.setText("");
_longitude.setText("");
Latitude = null;
Longitude = null;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
textViewResult.setText("");
}
});
}
Когда я запускаю приложение, приложение падает, давая мне следующую ошибку
Process: com.example.accurat.myapp, PID: 30382
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at com.example.accurat.myapp.MainActivity$DownloadJSON$1.onItemSelected(MainActivity.java:494)
at android.widget.AdapterView.fireOnSelected(AdapterView.java:931)
at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:920)
at android.widget.AdapterView.-wrap1(AdapterView.java)
at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:890)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5491)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Эта ошибка попадает в точку textViewResult.setText(" " + users.get(position - 1).getName() + " " + users.get(position - 1).getId());
Обновление 1
после ответа Junaid Hafeez
я сделал следующее
for(int i=0; i<jsonArray.length(); i++)
{
jsonObject = jsonArray.getJSONObject(i);
Users user = new Users();
user.setId(jsonObject.optString("Id"));
user.setName(jsonObject.optString("Name"));
users.add(user);
userList.add(jsonObject.optString("Name"));
}
userList.add(0, "Select a username"); // after for loop ended i add `select a username` at `0` index
после этого в методе postExecute()
я сделал следующее
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
textViewResult = (TextView)findViewById(R.id.textView);
// Set the text followed by the position
// Set the text followed by the position
if(position>0)
{
textViewResult.setText("Hi " + users.get(position).getName() + " your ID is " + users.get(position).getId());
UserId = String.valueOf(users.get(position).getId());
_latitude.setText("");
_longitude.setText("");
Latitude = null;
Longitude = null;
}
else {
}
progressDialog.dismiss();
}
Результат, который я получаю, ниже
Он показывает мне подсказку, но когда я выбираю любое имя пользователя, он показывает мне name
и ID
следующего имени пользователя, как показано на рисунке ниже.
Я привязался к нему и не мог найти какое-либо решение
Любая помощь будет высоко оценена.