2014-02-09 2 views
1

Я внедрил ListView с SectionIndexer. Он работает в 99% случаев, но я нашел одну ситуацию, в которой он дает ошибку.LIstView SectionIndexer, дающий ошибку ArrayIndexOutOfBoundsException

Ошибка:

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

И происходит в этом коде:

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

Debugging Я обнаружил, что описанный выше метод, для ввода я обеспечиваю в конце этого текст, называется два раза. Во второй раз, когда 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 (разделы [раздел]); } ' – Favolas

+0

Ницца, все еще логика такая же .. :) – astuter

Смежные вопросы