I have a spinner
that behaves like a dropdown
in my android application
. I am developing the app in android studio
. The spinner get data from the api
. At run time it gets usernames
from API
and shows in the spinner
. When app runs it shows the username
and ID
of the selected user like shown in below image
Now i want to add hint so i searched many articles and found many solutions and i follow the easiest of them. For more understanding please see the below code
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();
}
Now on onPostExecute() method
@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("");
}
});
}
When i run the application the app crashes while giving me the below error
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)
This error hits at the point textViewResult.setText(" " + users.get(position - 1).getName() + " " + users.get(position - 1).getId());
Update 1
following the answer of Junaid Hafeez
i have done the following
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
after that in postExecute()
method i have done the following
@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();
}
The result i get is below
It does show me the hint, but when i select any username it shows me the name
and id
of the next username as shown in below image
I am stuck to it and couldn't find any solution
Any help would be highly appreciated.
Hello Use below library for the hint spinner
Hint Spinner library
probably what you are doing is, you are clicking on first item of you spinner, where the
position = 0
and doing thisposition - 1
in yoursetText
which makes the index-1
that is actually not exists and crashes. Secondly you are doing thisin your loop, which is adding new item on each iteration. what you need to do is
once you have complete list of your data, just add hint on its 0 index like this
and in your onClick, check weather
position > 0
then do your work otherwise ignore as user clicked on hint.