ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – Spinner中的索引超出界限

2019-06-23 12:51:19  阅读:135  来源: 互联网

标签:java android android-spinner indexoutofboundsexception


有4个Spinnners:
resiko,untung1,untung2,untung3

用户首先选择resiko继续,应用程序将显示哪个Spinner可见(untung1 / untung2 / untung3)

试图制作动态数据Spinner,当你点击第一个Spinner内的一个项目时,其他的将会消失,并且到目前为止所需的一个将是可见的.
问题是当我从Spinner resiko中选择“tinggi”时,它会出错:java.lang.IndexOutOfBoundsException

我也试过阅读其他帖子,但仍不确定我该怎么做.
我之前尝试使用getSelectedItem(),但是当我想从用户选择的可见Spinner中获取所需数据时,应用程序本身并没有选择所选项目,而是选择了可见Spinner中的第一个数据. .
(假设Spinner,A和B中有2个值;用户选择B,但程序选择A)

在示例中:
用户在“resiko”Spinner中选择“rendah”,然后下一个可见的Spinner为untung,然后用户在该Spinner中选择“sedang”,
但程序选择“–pilih–”而不是“sedang”
这就是为什么我切换到getItemAtPosition(position).toString();

strings.xml中

<string-array name="spinner_resiko_string">
    <item>--Pilih--</item>
    <item>Sangat Rendah</item>
    <item>Rendah</item>
    <item>Sedang</item>
    <item>Tinggi</item>
</string-array>

<string-array name="spinner_return_string">
    <item>--Pilih--</item>
    <item>Rendah</item>
</string-array>

<string-array name="spinner_return_string2">
    <item>--Pilih--</item>
    <item>Rendah</item>
    <item>Sedang</item>
</string-array>

<string-array name="spinner_return_string3">
    <item>--Pilih--</item>
    <item>Rendah</item>
    <item>Sedang</item>
    <item>Tinggi</item>
</string-array>

微调器声明:

    final Spinner resiko = (Spinner) mScrollView.findViewById(R.id.spinner_resiko);
    final Spinner untung1 = (Spinner) mScrollView.findViewById(R.id.spinner_return1);
    final Spinner untung2 = (Spinner) mScrollView.findViewById(R.id.spinner_return2);
    final Spinner untung3 = (Spinner) mScrollView.findViewById(R.id.spinner_return3);

xml中的微调器:

<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner_return1"
    android:entries="@array/spinner_return_string"
    android:layout_marginLeft="10dp"/>
<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner_return2"
    android:entries="@array/spinner_return_string2"
    android:layout_marginLeft="10dp"/>
<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner_return3"
    android:entries="@array/spinner_return_string3"
    android:layout_marginLeft="10dp"/>

代码版本1(当我在resiko微调器中选择“tinggi”时出错的索引)[使用getItematPosition]:

 resiko.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> mRelative, View selectedItemView, int position, long id) {
            String resikox = mRelative.getItemAtPosition(position).toString();
            if (resikox.equals("Sangat Rendah")) {
                untung1.setVisibility(View.VISIBLE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.GONE);
                untungx = untung1.getItemAtPosition(position).toString();
            }
            else if (resikox.equals("Rendah")){
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.VISIBLE);
                untung3.setVisibility(View.GONE);
                untungx = untung2.getItemAtPosition(position).toString();
            }
            else if (resikox.equals("Sedang") || (resikox.equals("Tinggi"))) {
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.VISIBLE);
                untungx = untung3.getItemAtPosition(position).toString();
            } else {
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.GONE);
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // Another interface callback
        }
    });

版本2(使用getItemSelected)

 //set spinner
    resiko.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> mRelative, View selectedItemView, int position, long id) {
            String resikox = mRelative.getItemAtPosition(position).toString();
            if (resikox.equals("Sangat Rendah")) {
                untung1.setVisibility(View.VISIBLE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.GONE);
                untungx = untung1.getSelectedItem().toString();
            }
            else if (resikox.equals("Rendah")){
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.VISIBLE);
                untung3.setVisibility(View.GONE);
                untungx = untung2.getSelectedItem().toString();
            }
            else if (resikox.equals("Sedang") || (resikox.equals("Tinggi"))) {
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.VISIBLE);
                untungx = untung3.getSelectedItem().toString();
            } else {
                untung1.setVisibility(View.GONE);
                untung2.setVisibility(View.GONE);
                untung3.setVisibility(View.GONE);
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // Another interface callback
        }
    });

logcat:

12-23 19:37:23.221  30433-30433/com.example.fabio.tabdrawer E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.fabio.tabdrawer, PID: 30433
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.Arrays$ArrayList.get(Arrays.java:66)
        at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337)
        at android.widget.AdapterView.getItemAtPosition(AdapterView.java:831)
        at com.example.fabio.tabdrawer.Menu_PIAF$1.onItemSelected(Menu_PIAF.java:183)
        at android.widget.AdapterView.fireOnSelected(AdapterView.java:964)
        at android.widget.AdapterView.access$200(AdapterView.java:49)
        at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:928)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5487)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

解决方法:

您的< item> – Pilih – < / item>导致问题,因为它占据了你的微调器的第一项的位置.因此,当您选择最后一项时,Tinggi会抛出索引超出范围的错误.

这将为您提供有关如何在微调器顶部创建不可选项的建议:How to make an Android Spinner with initial text “Select One”

你可以改变可见性,这是​​一个好主意,但是你需要为每个微调器实现单独的onItemSelectedListener.
resiko,untung1,untung2,untung3,因为它们是独立的元素,并且具有不同大小的数组.

虽然看起来更多的工作,但保持UI元素交互是分开的很重要.

现在,如果有一个用户选择通用的方法,则可以进行模块化.

例:
因此,如果多个不同的项目选择导致背景颜色在名为的方法中变为黄色:

turnBackgroundYellow()

然后,此方法可以根据您的需要放置在项目选定的事件中.

然而反过来不起作用.

每个独特的微调器都需要将它的听众专门连接到它上面.

创建这些类变量,以便将它们作为参数传递给类方法.

String resikox_;
String untung1_; // and the others

// Create an ArrayAdapter using the string array and a default spinner layout
// Create a separate one for each spinner resiko,untung1,untung2,untung3
ArrayAdapter<CharSequence> adapter = ArrayAdapter
            .createFromResource(getActivity(), R.array.dataobjects_array,
                    android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(
            android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
resiko.setAdapter(adapter);
// Create a separate one for each spinner resiko,untung1,untung2,untung3
resiko.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        resikox_ = parent.getItemAtPosition(position).toString();
        SelectedItemMethod(resikox_)
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        //DO WHATEVER OR NOTHING
                }
});

// Class method to do your item selection stuff.
public void SelectedItemMethod(String item){

    if (item.equals("Sangat Rendah")) {
        untung1.setVisibility(View.VISIBLE);
        untung2.setVisibility(View.GONE);
        untung3.setVisibility(View.GONE);
    }
    //etc, etc for all your spinners or break it up, as you please

标签:java,android,android-spinner,indexoutofboundsexception
来源: https://codeday.me/bug/20190623/1270947.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有