Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Я забыл создать экземпляр alphaIndexer. Теперь работает отлично.

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)
    {
        return 1;
    }

    public Object[] getSections()
    {
        return sections;
    }
}

Ответ 2

Если я правильно вас понимаю, вы хотите установить fastScrollEnabled=true, и это даст вам небольшой скроллер большого пальца справа. Если вы хотите добавить плавающее письмо, подобное тому, которое находится в контактах, есть отличный пример в проекте APIDemos в List9.java(http://www.devdaily.com/Java/jwarehouse/андроид-примеры/платформы/андроид-2/образцы/ApiDemos/SRC/COM/пример/Android/APIs/просмотр/List9.java.shtml)