Как отображать буквы алфавита на стороне Android ListView

Я просмотрел множество руководств по созданию 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) говорит о том, что вы просто прокручиваете первую (или вторую) секцию, что приведет к неправильному положению скроллера (в основном выходит за пределы экрана). Добавленный код возвращает соответствующий раздел, чтобы скроллер мог знать, где он на самом деле.

34
задан Pat Needham 22 June 2018 в 16:53
поделиться