Ошибка быстрой прокрутки в ListView

Я работаю над приложением словаря. У меня есть список с включенной быстрой прокруткой и адаптер, который реализует SectionIndexer. Когда я работаю с китайским словарем, у меня гораздо больше разделов, чем при работе с западноевропейскими языками, и у меня есть небольшая проблема:

если я остановлю быструю прокрутку и пока видимы полосы прокрутки, начните использовать прокрутку по умолчанию, моя "быстрая прокрутка" неуклонно перемещается в другую позицию (где-то вверху), и только когда я доберусь почти до конца списка, она начнется двигаясь в мою позицию тоже с гораздо большей скоростью.

Есть ли причина для такого поведения? Есть ли способ скрыть полосы быстрой прокрутки при использовании прокрутки по умолчанию (но без отключения быстрой прокрутки)?

1 ответ

Думал, что я опубликую здесь в надежде, что еще не поздно.

Примечание: здесь не используется AlphabetIndexer, и я не думаю, что использование трех коллекций для управления списком - хорошая идея, хотя она и проста и объясняет концепцию.

Ниже приведен базовый пример использования обратных вызовов:

public LinkedHashMap<Integer,String> sectionList = new LinkedHashMap<Integer,String>();
public HashMap<Integer,Integer> sectionPositions = new HashMap<Integer, Integer>();
public HashMap<Integer,Integer> positionsForSection = new HashMap<Integer, Integer>();  

Когда у вас есть массив "местоположений" (предварительно упорядоченный), это создаст три хеш-карты для отслеживания вещей, действительно простая реализация, действительно легко читаемая:

 if( locations != null && locations.size() > 0 ) {
    //Iterate through the contacts, take the first letter, uppercase it, and use that as a key to reference the alphabetised list constructed above. 
    for( int i = 0; i < locations.size(); i++ ) {
        String startchar =locations.get(i).getStartCharacterForAlphabet();

        if( startchar != null ) {
            if( sectionList.containsValue(startchar) == false ) {
                sectionList.put(Integer.valueOf(i),startchar);
                positionsForSection.put(Integer.valueOf(sectionList.size() - 1), Integer.valueOf(i));
            }
        }

        sectionPositions.put(Integer.valueOf(i), sectionList.size() - 1);
    }  
}   

И вот три обратных вызова:

@Override
public int getPositionForSection(int section) {
    return positionsForSection.get(Integer.valueOf(section)).intValue();
}

@Override
public MyLocation getItem(int position) {
    if( locations.size() > position ) {
        return locations.get(position);
    }

    return null;
}

@Override
public int getSectionForPosition(int position) {
    return sectionPositions.get(Integer.valueOf(position)).intValue();
}

Надеюсь, поможет!

Другие вопросы по тегам