我创建了一个字母顺序适配器,通过添加标头和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;
}
}
答案 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]);
}
一切运转良好。问题解决了: - )