Я просмотрел множество руководств по созданию ListView с алфавитными буквами сбоку (например, список контактов), но все они, похоже, используют ListActivity класс и / или данные из базы данных, в то время как я просто использую ListView (без специального действия) и ArrayList данных. Кто-нибудь знает, как я могу реализовать эту функцию алфавитной прокрутки в списке контактов для моего собственного ListView?
Снова отредактировано
Я следовал этому руководству , который, как я думал, наконец заставит его работать, но я все еще получаю принудительное закрытие.
class AlphabeticalAdapter extends ArrayAdapter implements SectionIndexer
{
private HashMap alphaIndexer;
private String[] sections;
public AlphabeticalAdapter(Context c, int resource, List 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 sectionLetters = alphaIndexer.keySet();
ArrayList sectionList = new ArrayList(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: невозможно возобновить действие {(пакет другого приложения, которое я создал) android.app.SuperNotCalledExcpetion
. Я подумал, что это было действительно странно, потому что я вообще не упоминаю это другое приложение в том, с которым я работаю. Я попытался удалить это другое приложение, но все равно получил принудительное закрытие, но я мог видеть, что сказал LogCat, потому что он не обновлялся.
Final Edit
Вот рабочий код. Извините за то, что опубликовал что-то вроде задержки на 9 месяцев.
class AlphabeticalAdapter extends ArrayAdapter implements SectionIndexer
{
private HashMap alphaIndexer;
private String[] sections;
public AlphabeticalAdapter(Context c, int resource, List data)
{
super(c, resource, data);
alphaIndexer = new HashMap();
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 sectionLetters = alphaIndexer.keySet();
ArrayList sectionList = new ArrayList(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) говорит о том, что вы просто прокручиваете первую (или вторую) секцию, что приведет к неправильному положению скроллера (в основном выходит за пределы экрана). Добавленный код возвращает соответствующий раздел, чтобы скроллер мог знать, где он на самом деле.