无法在Android微调器中添加提示 [英] Unable to add hint in android spinner

查看:41
本文介绍了无法在Android微调器中添加提示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的android application中的行为类似于dropdownspinner.我正在android studio中开发该应用程序.微调器从api获取数据.在运行时,它从API获取usernames并显示在spinner中.应用运行时,它会显示所选用户的usernameID,如下图所示

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();

            }

我得到的结果低于

它确实显示了提示,但是当我选择任何用户名时,它都会显示下一个用户名的nameid,如下图所示

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆