实现SectionIndexer的BaseExpandableListAdapter中的IndexOutOfBoundsException

时间:2012-08-26 19:56:43

标签: android expandablelistview

我创建了一个字母顺序适配器,通过添加标头和expandableListView从this post启发。 我列表中的每一组都只有一个孩子。

有时候,由于我不理解的原因,Android会使用getPositionForSection方法给我一个IndexOutOfBoundsException。调用的部分超出了我的部分字符串数组的范围。我认为这是因为可扩展列表,但我不确定。你能救我吗?

public class AlphabeticalAdapter extends BaseExpandableListAdapter implements SectionIndexer{

private HashMap<String, Integer> alphaIndexer;
private String[] sections;
private HashMap<String, String> dictionnary;
private ArrayList<String> words;
private LayoutInflater inflater;

public AlphabeticalAdapter(Context context, HashMap<String, String> dictionnary){

    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.dictionnary = dictionnary;
    this.words = new ArrayList<String>(this.dictionnary.keySet());
    Collections.sort(this.words, String.CASE_INSENSITIVE_ORDER);

    this.alphaIndexer = new HashMap<String, Integer>();
    for (int i = 0; i < this.words.size(); i++){
        String s = this.words.get(i).substring(0, 1).toUpperCase();
        if (!this.alphaIndexer.containsKey(s)){
            this.alphaIndexer.put(s, i);
        }
    }

    Set<String> sectionLetters = this.alphaIndexer.keySet();
    ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
    Collections.sort(sectionList);

    this.sections = new String[sectionList.size()];
    for (int i = 0; i < sectionList.size(); i++){
        this.sections[i] = sectionList.get(i);
    }

}

@Override
public int getSectionForPosition(int position){

    String currentFirstChar = this.words.get(position).substring(0, 1).toUpperCase();
    for (int section = 0; section < this.sections.length; section++){
        if (this.sections[section].equals(currentFirstChar)){
            return section;
        }
    }

    return 1;

}

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

@Override
public Object[] getSections(){
    return this.sections;
}

@Override
public Object getGroup(int groupPosition) {
    return this.words.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return this.dictionnary.get(getGroup(groupPosition));
}

@Override
public int getGroupCount() {
    return this.dictionnary.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return 1;
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {

    View view = (View) inflater.inflate(R.layout.glossary_word_row, null);

    TextView header = (TextView) view.findViewById(R.id.section);
    TextView rowText = (TextView) view.findViewById(R.id.textView);

    String currentWord = this.words.get(groupPosition);
    String currentFirstChar = currentWord.substring(0, 1).toUpperCase();

    rowText.setText(currentWord);

    if (groupPosition == this.alphaIndexer.get(currentFirstChar)){
        header.setVisibility(View.VISIBLE);
        header.setText(currentFirstChar);
    }

    return view;

}

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

    View view = (View) this.inflater.inflate(R.layout.glossary_word_row, null);
    TextView rowText = (TextView) view.findViewById(R.id.textView);
    rowText.setText(this.dictionnary.get(this.words.get(groupPosition)));

    return view;

}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}

}

1 个答案:

答案 0 :(得分:4)

我不明白为什么用错误的参数调用这个方法,但我在the official Android documentation看到了这个:

  

返回:该部分的起始位置。如果该部分超出范围,则必须剪切该位置以使其落在列表的大小范围内。

所以我写了这个:

@Override
public int getPositionForSection(int section){
    if (section >= this.sections.length){
        return getGroupCount() - 1;
    }
    return this.alphaIndexer.get(this.sections[section]);   
}

一切运转良好。问题解决了: - )