无法在Android微调器中添加提示 [英] Unable to add hint in android spinner
问题描述
我的android application
中的行为类似于dropdown
的spinner
.我正在android studio
中开发该应用程序.微调器从api
获取数据.在运行时,它从API
获取usernames
并显示在spinner
中.应用运行时,它会显示所选用户的username
和ID
,如下图所示
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();
}
现在使用 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("");
}
});
}
当我运行应用程序时,应用程序崩溃,同时出现以下错误
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)
此错误发生在textViewResult.setText(" " + users.get(position - 1).getName() + " " + users.get(position - 1).getId());
更新1
按照Junaid Hafeez
的回答,我已经完成了以下操作
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
在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
,如下图所示
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
任何帮助将不胜感激.
推荐答案
可能是您正在做的,您正在单击微调器的第一项,其中position = 0
并在setText
中执行此position - 1
这会使实际上不存在的索引-1
崩溃.
其次,您正在这样做
probably what you are doing is, you are clicking on first item of you spinner, where the position = 0
and doing this position - 1
in your setText
which makes the index -1
that is actually not exists and crashes.
Secondly you are doing this
userList.add("Select a username");// i add this as a hint
在您的循环中,该循环将在每次迭代中添加新项目. 您需要做的是
in your loop, which is adding new item on each iteration. what you need to do is
一旦您拥有完整的数据列表, 像这样在其0索引上添加提示
once you have complete list of your data, just add hint on its 0 index like this
userList.add(0, "Select a username");
并在您的onClick中,检查天气position > 0
,然后执行您的工作,否则在用户单击提示时将其忽略.
and in your onClick, check weather position > 0
then do your work otherwise ignore as user clicked on hint.
这篇关于无法在Android微调器中添加提示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!