2014-02-09 55 views
1

我實現了ListViewSectionIndexer。它正在工作99%的時間,但我發現一種情況下,它是錯誤的。LIstView SectionIndexer給出錯誤ArrayIndexOutOfBoundsException

錯誤是:

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 

而且是在該代碼發生的事情:

@Override 
    public int getPositionForSection(int section) { 
     return indexer.get(sections[section]); 
    } 

調試我發現,在上述方法中,對於輸入I處提供的此端部文字,被稱爲兩次。第二次,section假設值1它給出錯誤。

我的適配器以這種方式實現:

public class SearchAdapter extends ArrayAdapter<String[]> implements SectionIndexer { 
    private final Context context; 
    private ArrayList<String[]> foodData; 
    private HashMap<String, Integer> indexer; 
    private String[] sections; 

    public SearchAdapter(Context context, ArrayList<String[]> allFoodData) { 
     super(context, R.layout.rowlist, allFoodData); 
     this.context = context; 
     this.foodData = allFoodData; 


     indexer = new HashMap<String, Integer>(); 
     int size = foodData.size(); 
     for (int x = 0; x < size; x++) { 
      String[] s = foodData.get(x); 
      System.out.println("x = " + x + ": foodata[0]=" + s[0] + ": foodata[1]=" + s[1] + ": foodata[2]=" + s[2] + ": foodata[3]=" + s[3]); 

      String ch = s[1].substring(0,1); 
      ch = ch.toUpperCase(); 
      if (!indexer.containsKey(ch)) 
       indexer.put(ch, x); 
     } 

     Set<String> sectionLetters = indexer.keySet(); 
     // create a list from the set to sort 
     ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
     Collections.sort(sectionList); 
     sections = new String[sectionList.size()]; 
     sections = sectionList.toArray(sections); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    \\\\\\\ stuff 
    } 

    // ##################### LISTVIEW INDEX ##################### 
    @Override 
    public Object[] getSections() { 
     return sections; 
    } 

    @Override 
    public int getPositionForSection(int section) { 
     return indexer.get(sections[section]); 
    } 

    @Override 
    public int getSectionForPosition(int position) { 
     return 0; 
    } 
} 

輸入是:

x = 0: foodata[0]=81: foodata[1]=Iogurte Açucarado batido gordo com cereais e fruta: foodata[2]=PT INSA: foodata[3]=1 
x = 1: foodata[0]=80: foodata[1]=Iogurte Açucarado batido gordo com fruta: foodata[2]=PT INSA: foodata[3]=1 
x = 2: foodata[0]=70: foodata[1]=Iogurte Açucarado batido meio gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 3: foodata[0]=75: foodata[1]=Iogurte Açucarado batido meio gordo com fruta: foodata[2]=PT INSA: foodata[3]=1 
x = 4: foodata[0]=69: foodata[1]=Iogurte Açucarado com edulcorante de síntese, batido magro com cereais: foodata[2]=PT INSA: foodata[3]=1 
x = 5: foodata[0]=68: foodata[1]=Iogurte Açucarado com edulcorante de síntese, sólido magro: foodata[2]=PT INSA: foodata[3]=1 
x = 6: foodata[0]=71: foodata[1]=Iogurte Açucarado líquido meio gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 7: foodata[0]=82: foodata[1]=Iogurte Aromatizado açucarado batido gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 8: foodata[0]=72: foodata[1]=Iogurte Aromatizado açucarado batido meio gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 9: foodata[0]=77: foodata[1]=Iogurte Aromatizado açucarado líquido magro: foodata[2]=PT INSA: foodata[3]=1 
x = 10: foodata[0]=73: foodata[1]=Iogurte Aromatizado açucarado líquido meio gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 11: foodata[0]=78: foodata[1]=Iogurte Aromatizado açucarado sólido magro: foodata[2]=PT INSA: foodata[3]=1 
x = 12: foodata[0]=74: foodata[1]=Iogurte Aromatizado açucarado sólido meio gordo: foodata[2]=PT INSA: foodata[3]=1 
x = 13: foodata[0]=79: foodata[1]=Iogurte Natural sólido magro: foodata[2]=PT INSA: foodata[3]=1 
x = 14: foodata[0]=76: foodata[1]=Iogurte Natural sólido meio gordo: foodata[2]=PT INSA: foodata[3]=1 

正如你可以看到,指數只是一個字母,在這種情況下"I"。我已經嘗試過只產生一個字母索引的其他輸入,這是唯一一個給我錯誤的情況。

任何想法爲什麼?

+0

有同樣的問題,沒有人有答案,這??? – astuter

回答

3

這可以解決你的問題:

public int getPositionForSection(int section) { 

     if (section > sections.length - 1) { 
      return 0; 
     } else { 

      return alphaIndexer.get(sections[section]); 
     } 
    } 
+0

謝謝,但像這樣解決:'if(section> sections.length - 1){return。sections.length - 1; } else { return indexer.get(sections [section]); }' – Favolas

+0

不錯,仍然邏輯是相同的.. :) – astuter

相關問題