首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从自定义列表视图抓取筛选项时的IndexOutOfBound

从自定义列表视图抓取筛选项时的IndexOutOfBound
EN

Stack Overflow用户
提问于 2015-07-24 11:47:53
回答 2查看 96关注 0票数 3

我已经创建了一个自定义列表视图,它生成正确的数据,但是当我尝试按其名称搜索特定项时,它会返回正确的项,但在1秒后由于一个IndexOutOfBoundException而崩溃,不太确定为什么要将所有数组初始化到正确的大小。

BossAdapter.java Boss.java

代码语言:javascript
复制
ListView listView;
int[] boss_icon = {R.drawable.boss_1, R.drawable.boss_2, R.drawable.boss_3,
        R.drawable.boss_4, R.drawable.boss_5, R.drawable.boss_6, R.drawable.boss_7,
        R.drawable.boss_8, R.drawable.boss_9, R.drawable.boss_10, R.drawable.boss_11,
        R.drawable.boss_12, R.drawable.boss_13, R.drawable.boss_14, R.drawable.boss_15,
        R.drawable.boss_16, R.drawable.boss_17, R.drawable.boss_18};
String[] boss_title=  new String[18];
BossAdapter adapter;
String[] bossTime=  new String[18];
Handler handler;
String[] bossAppearance=  new String[18];
EditText search_view;
ArrayList<Boss> bossList;
int bossID;

private int getID(String name){
    int id = 0;

    switch(name){
        case "다크 지란트":
            id = 0;
            return id;
        case "머쉬맘":
            id = 1;
            return id;
        case "MARK52 ALPHA":
            id = 2;
            return id;
        case "깡패 바라하":
            id = 3;
            return id;
        case "데블린 워리어":
            id = 4;
            return id;
        case "닉시":
            id = 5;
            return id;
        case "에피":
            id = 6;
            return id;
        case "자이언트 라바아이":
            id = 7;
            return id;
        case "둔둔":
            id = 8;
            return id;
        case "레버넌트 좀비":
            id = 9;
            return id;
        case "우르자":
            id = 10;
            return id;
        case "부기콜리":
            id = 11;
            return id;
        case "그리폰":
            id = 12;
            return id;
        case "프랑케네뜨":
            id = 13;
            return id;
        case "경비대장 차우":
            id = 14;
            return id;
        case "그리피나":
            id = 15;
            return id;
        case "매드오네뜨":
            id = 16;
            return id;
        case "자이언트 터틀":
            id = 17;
            return id;
    }

    return id;
}
private void createListview(){
    listView = (ListView) findViewById(R.id.list_view);
    search_view = (EditText)findViewById(R.id.search_text);

    boss_title = getResources().getStringArray(R.array.boss_array);

    bossList = new ArrayList<Boss>();


    adapter = new BossAdapter(getApplicationContext(), bossList);


    listView.setAdapter(adapter);
    listView.setTextFilterEnabled(true);
    bossTime = getKoreanTime();


    // Moved our object creation here, so that it should only be done once.
    for (String boss : boss_title) {
        bossID = getID(boss);
        bossAppearance = bossAppearance(bossID);


        Boss bossObject = new Boss(boss_icon[bossID], boss, bossTime[bossID], bossAppearance[bossID]);
        bossList.add(bossObject);

    }



    handler = new Handler();
    Runnable update = new Runnable() {
        @Override
        public void run() {
            bossTime = getKoreanTime();
            int count = adapter.getCount();

            for(String boss: boss_title){
                bossID = getID(boss);
                bossAppearance = bossAppearance(bossID);
                ((Boss) adapter.getItem(bossID)).setBoss_time(bossTime[bossID]); // Re-set time
                ((Boss) adapter.getItem(bossID)).setBoss_appearance(bossAppearance[bossID]);
            }

            adapter.notifyDataSetChanged(); // Notify our update
            handler.postDelayed(this, 1000);
        }
    };
    handler.postDelayed(update, 10);

    EditText myFilter = (EditText) findViewById(R.id.search_text);
    myFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            adapter.getFilter().filter(s.toString());
        }
    });

}

Strings.xml

代码语言:javascript
复制
 Boss Timer
代码语言:javascript
复制
<string-array name="boss_array">
    <item>다크 지란트</item>
    <item>머쉬맘</item>
    <item>MARK52 ALPHA</item>
    <item>깡패 바라하</item>
    <item>데블린 워리어</item>
    <item>닉시</item>
    <item>에피</item>
    <item>자이언트 라바아이</item>
    <item>둔둔</item>
    <item>레버넌트 좀비</item>
    <item>우르자</item>
    <item>부기콜리</item>
    <item>그리폰</item>
    <item>프랑케네뜨</item>
    <item>경비대장 차우</item>
    <item>그리피나</item>
    <item>매드오네뜨</item>
    <item>자이언트 터틀</item>

</string-array>

逻辑猫

代码语言:javascript
复制
07-24 17:11:18.628  11159-11159/baegmon.com.bosstimer E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: baegmon.com.bosstimer, PID: 11159
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at baegmon.com.bosstimer.BossAdapter.getItem(BossAdapter.java:38)
        at baegmon.com.bosstimer.MainActivity$1.run(MainActivity.java:158)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5257)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
EN

回答 2

Stack Overflow用户

发布于 2015-07-24 12:13:23

您忘记将数据集中的更改通知适配器。

代码语言:javascript
复制
// Moved our object creation here, so that it should only be done once.
for (String boss : boss_title) {
    ...
}
adapter.notifyDataSetChanged(); // This is required

为了避免任何混淆,上面的for循环是代码中显示的第一个循环。

票数 0
EN

Stack Overflow用户

发布于 2015-07-24 12:46:20

这是一个问题,boss_title有18个条目。您正在尝试将循环从0迭代到18,然后得到列表中不存在的第n项。

代码语言:javascript
复制
((Boss) adapter.getItem(bossID)).setBoss_time(bossTime[bossID]);

bossID可能是比列表大小更大的东西。

……

代码语言:javascript
复制
for(String boss: boss_title){
                bossID = getID(boss);
                bossAppearance = bossAppearance(bossID);
                ((Boss) adapter.getItem(bossID)).setBoss_time(bossTime[bossID]); // Re-set time
                ((Boss) adapter.getItem(bossID)).setBoss_appearance(bossAppearance[bossID]);
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31609801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档