Я просмотрел множество учебников для создания ListView, имеющих алфавитные буквы на стороне (например, список контактов), но все они, похоже, используют класс ListActivity и/или данные из базы данных, пока я просто используя ListView (нет специального Activity) и ArrayList данных. Кто-нибудь знает, как я могу реализовать эту функцию в алфавитном порядке в списке контактов для моего собственного ListView?
Отредактировано снова
Я следил за этот учебник, который, как я думал, наконец-то заставил бы его работать, но я все равно получаю принудительное закрытие.
class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer
{
private HashMap<String, Integer> alphaIndexer;
private String[] sections;
public AlphabeticalAdapter(Context c, int resource, List<String> data)
{
super(c, resource, data);
for (int i = 0; i < data.size(); i++)
{
String s = data.get(i).substring(0, 1).toUpperCase();
alphaIndexer.put(s, i);
}
Set<String> sectionLetters = alphaIndexer.keySet();
ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
Collections.sort(sectionList);
sections = new String[sectionList.size()];
sectionList.toArray(sections);
}
public int getPositionForSection(int section)
{
return alphaIndexer.get(sections[section]);
}
public int getSectionForPosition(int position)
{
return 1;
}
public Object[] getSections()
{
return sections;
}
}
В LogCat говорится java.lang.RuntimeException: Unable to resume activity {(package of another app I made) android.app.SuperNotCalledExcpetion
. Я подумал, что это действительно странно, потому что я не ссылаюсь на это другое приложение в той, с которой я работаю. Я попытался удалить это другое приложение, все еще получил принудительное закрытие, но я мог видеть, что сказал LogCat, потому что он не обновлялся.
Финальное редактирование
Вот рабочий код. Извините за то, что вы отправили ему что-то вроде 9 месяцев просрочки.
class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer
{
private HashMap<String, Integer> alphaIndexer;
private String[] sections;
public AlphabeticalAdapter(Context c, int resource, List<String> data)
{
super(c, resource, data);
alphaIndexer = new HashMap<String, Integer>();
for (int i = 0; i < data.size(); i++)
{
String s = data.get(i).substring(0, 1).toUpperCase();
if (!alphaIndexer.containsKey(s))
alphaIndexer.put(s, i);
}
Set<String> sectionLetters = alphaIndexer.keySet();
ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
Collections.sort(sectionList);
sections = new String[sectionList.size()];
for (int i = 0; i < sectionList.size(); i++)
sections[i] = sectionList.get(i);
}
public int getPositionForSection(int section)
{
return alphaIndexer.get(sections[section]);
}
public int getSectionForPosition(int position)
{
for ( int i = sections.length - 1; i >= 0; i-- ) {
if ( position >= alphaIndexer.get( sections[ i ] ) ) {
return i;
}
}
return 0;
}
public Object[] getSections()
{
return sections;
}
}
Изменить: getSectionForPosition важно, если вы хотите, чтобы ваш скроллер отображался в нужном месте во время прокрутки. Возврат только 1 (или 0) говорит о том, что вы просто прокручиваете первую (или вторую) секцию, что приведет к неправильной позиции скроллера (в основном, выходит за пределы экрана). Добавленный код возвращает соответствующий раздел, поэтому скроллер может знать, где он на самом деле.