0

この投稿からインスピレーションを得て、ヘッダーの追加と expandableListView 用のアルファベット順のアダプターを作成しました。私のリストの各グループには、ちょうど 1 人の子がいます。

時々、理由がわかりませんが、Android は getPositionForSection メソッドで IndexOutOfBoundsException を返します。呼び出されたセクションは、my セクション文字列配列の範囲外です。展開可能なリストが原因だと思いますが、よくわかりません。手伝って頂けますか ?

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;
}

}
4

1 に答える 1

4

このメソッドが間違ったパラメーターで呼び出される理由はわかりませんが、Android の公式ドキュメントで次のことを確認しました。

戻り値: そのセクションの開始位置。セクションが範囲外の場合、リストのサイズ内に収まるように位置をクリップする必要があります。

だから私はこれを書いています:

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

そして、すべてがうまくいっています。問題が解決しました :-)

于 2012-08-30T18:40:51.500 に答える