Перейти к содержанию
Fire Monkey от А до Я
  • 0

Алфавитный скроллинг для ListView


Rusland

Вопрос

Как можно сделать алфавитный скроллинг подобно этому?

 

3S0YI.jpgandroid-listview-fastscroll-styling-589x

 

Если список очень большой, то прокрутка происходит очень долго. Есть какие-нибудь идеи?

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

TListBox

attachicon.gifalphLB.zip

 

TListView

attachicon.gifalphLV.zip

Спасибо. Сейчас поглядим :)

ZuBy, это не совсем то что я имел в виду )

Мне хочется ускорить прокрутку списка, так как элементов много. Это моя вина, не правильно сформулировал вопрос )

Поищу видео чтобы объяснить что я имею в виду 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Насколько я понял нужна такая штука
 

Screenshot_2015_12_17_12_45_55.png

В "LBMouseUP" скрольте до того места, куда вам надо попасть

ListBoxAtoZ.zip

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0
  • Модераторы

Вот снял видео с одного приложения

https://yadi.sk/i/oQNGe9t9mHgFM

не понял, чем отличается от моего?)

Ссылка на комментарий
  • 0

Тут вот в чем дело - список должен быть отсортированным по алфавиту, о чем я забыл упоминуть.

 

не понял, чем отличается от моего?)

Постараюсь пояснить...

На видео видно что справа есть скроллинг (в alph**.zip такого нет), по которому можно очень быстро перемещаться вверх/вниз (если двигаешь пальцем по списку - скроллируется со стандартной скоростью, а когда двигаешь пальцем по этому скролл-у то перемещения в несколько раз быстрее)... подобное есть на iOs - там можно выбрать букву и список автоматически перемещается на на item с названием начинающимся на эту букву (см. первую картинку первого поста)... я всегда думал что этот алфавит и скролл - есть нечто неотделимое, поэтому и назвал тему Алфавитный скроллинг :)

В рамках названия темы ваши примеры как раз то что нужно.

 

Создам пожалуй другую тему с название Быстрый скроллинг по ListView. 

 

Alexander616, ваш пример как раз делает почти то что нужно... надо как-то связать с основным списком чтобы он скроллировался в зависимости от выбранной буквы и перемещение алфавита должно быть в обратную сторону :)

 

 

PS. посмотрите в андройде в стандартном приложении Контакты есть такой скроллер... надеюсь теперь понятно что я имел в виду? ))

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

 

Alexander616, ваш пример как раз делает почти то что нужно... надо как-то связать с основным списком чтобы он скроллировался в зависимости от выбранной буквы и перемещение алфавита должно быть в обратную сторону :)

 

 

PS. посмотрите в андройде в стандартном приложении Контакты есть такой скроллер... надеюсь теперь понятно что я имел в виду? ))

Не совсем понял "перемещение алфавита должно быть в обратную сторону"

в моём примере, я связал с основным, но возможно есть и более оптимальный способ. При LBMouseMove я обхожу весь основной листбокс и ищу первую запись, которая начинается на выбранную букву, скорее всего при большом количестве записей будет подвисать

PS. Если уменьшить размер лист айтема в алфавитном листбоксе, будет почти тоже самое что и в списке контактов)

ListBoxAtoZ.zip

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0
Alexander616ваш пример больше похож на вариант как это сделано в iOS, но тогда нужно чтобы весь алфавит умещался на экране. (Можно ли это сделать с ListBox?)  А сейчас при скроллировании по алфавиту  сам алфавит ездит туда сюда )

 

Вариант ZuBy больше напоминает как сделано в Android... надо только отдельный скроллер прикрутить.

Сейчас буду думать как лучше ))

 

Посмотрел еще раз пример ZuBy alphLB. Сейчас заметил что видно наличие ползунка скроллера (он почти сливается с фоном), но "ухватиться" за него, чтобы ускоренно скроллить, не получается. :(

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

 

Alexander616ваш пример больше похож на вариант как это сделано в iOS, но тогда нужно чтобы весь алфавит умещался на экране. (Можно ли это сделать с ListBox?)  А сейчас при скроллировании по алфавиту  сам алфавит ездит туда сюда )

 

Вариант ZuBy больше напоминает как сделано в Android... надо только отдельный скроллер прикрутить.

Сейчас буду думать как лучше ))

 

Посмотрел еще раз пример ZuBy alphLB. Сейчас заметил что видно наличие ползунка скроллера (он почти сливается с фоном), но "ухватиться" за него, чтобы ускоренно скроллить, не получается. :(

 

как вариант, можно извратиться и посчитать высоту экрана, разделить на 26 (либо сколько букв/символов/цифр вам надо) и установить высоту каждого айтема в листбоксе отдельно, чтобы не надо было прокручивать алфавитный скролер

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0
  • Модераторы

уместить у меня весь алфавит в LB так и не получилось, единственное решение вижу объединить некоторые буквы

использовал русский алфавит

 

- сортировка ListView

- формирование ListBox в зависимости от контента ListView

alphLV.zip

Ссылка на комментарий
  • 0

как вариант, можно извратиться и посчитать высоту экрана, разделить на 26 (либо сколько букв/символов/цифр вам надо) и установить высоту каждого айтема в листбоксе отдельно, чтобы не надо было прокручивать алфавитный скролер

Хотелось бы избежать "извращений" :)

 

 

уместить у меня весь алфавит в LB так и не получилось, единственное решение вижу объединить некоторые буквы

использовал русский алфавит

 

- сортировка ListView

- формирование ListBox в зависимости от контента ListView

attachicon.gifalphLV.zip

За сортировку ListView отдельное спасибо )

Все же я не понимаю, и там где пример с ListView и там где пример ListBox видно полосу прокрутки и ползунок (при начале прокрутки)... в примере с ListView я даже могу его ухватить и перемещать (до тех пор пока он не пропадет), но скроллинга списка не происходит. Почему так?

 

Кстати, а почему Ё вверх алфавита лезет? И что за свойство AutoTapScroll у ListView? Может от него что-то зависит?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Запустил alphLV из под Windows - встроенный скроллер работает! Выходит что он не работает только под Android? (или у меня только не работает и поэтому у всех возникает вопрос "а что не так?") :)

Ссылка на комментарий
  • 0
  • Модераторы
Кстати, а почему Ё вверх алфавита лезет?

 

Почему буква вверху, для меня тоже загадка

 

 

Запустил alphLV из под Windows - встроенный скроллер работает! Выходит что он не работает только под Android? (или у меня только не работает и поэтому у всех возникает вопрос "а что не так?") :)

да на мобильных он не работает, это просто индикатор положения

Ссылка на комментарий
  • 0

да на мобильных он не работает, это просто индикатор положения

 

Раз такое дело, то решил прикрутить к ListView  ScrollBar. Сразу возникло два новых вопроса:

1.) Можно ли скрыть этот самый индикатор положения? (лучше бы конечно чтобы Embarcadero довела его до ума)

    В ListBox-е вроде можно убрать c помощью ShowScrollBars (но не проверял). А как в ListView?

2.) Как при скроллировании пальцем по списку переносить в ScrollBar текущее положение ползунка? 

 

PS. Попробовал в OnTimer написать ScrollBar1.Value:=ListView1.getFirstVisibleItemIndex;

      работает, но как-то корявенько выходит :)

alphLVS.zip

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

2.) Как при скроллировании пальцем по списку переносить в ScrollBar текущее положение ползунка? 

 

PS. Попробовал в OnTimer написать ScrollBar1.Value:=ListView1.getFirstVisibleItemIndex;

      работает, но как-то корявенько выходит :)

 

да вроди если в ListView1ScrollViewChange 

ScrollBar1.Value:=ListView1.getFirstVisibleItemIndex;

посадить, всё нормально, зачем таймер?

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0

да вроди если в ListView1ScrollViewChange 

ScrollBar1.Value:=ListView1.getFirstVisibleItemIndex;

посадить, всё нормально, зачем таймер?

Если посадить на ListView1ScrollViewChange, то будет вечный конфликт ) Изменение Scrollbar1.Value влечет вызов ScrollBar1Change где происходит скроллирование LV. Следовательно будет вызван ListView1ScrollViewChange... получится бесконечный цикл )

Ссылка на комментарий
  • 0
 

 

да вроди если в ListView1ScrollViewChange 

ScrollBar1.Value:=ListView1.getFirstVisibleItemIndex;

посадить, всё нормально, зачем таймер?

Если посадить на ListView1ScrollViewChange, то будет вечный конфликт ) Изменение Scrollbar1.Value влечет вызов ScrollBar1Change где происходит скроллирование LV. Следовательно будет вызван ListView1ScrollViewChange... получится бесконечный цикл )

 

ну тогда можно взять переменную, и переключать её когда меняется из ListView

ListView1ScrollViewChange:

ScrollBarChange := True;
ScrollBar1.Value := ListView1.getFirstVisibleItemIndex;
ScrollBarChange := False;

ScrollBar1Change:
  if not ScrollBarChange then
    ListView1.ScrollTo(Round(ScrollBar1.Value));



 
Ссылка на комментарий
  • 0

Кстати на скролбаре что ползунок, его никак не увеличить? Из-за того что он меньше чем ползунок listview, образуется "слепая зона", в которой двигаешь ползунок а список остаётся на месте 

Ссылка на комментарий
  • 0

Кстати, стандартный ScrollBar можно спрятать, если скопировать в свой проект FMX.ListView.pas

и изменить 

const
...
{$IFDEF ANDROID}
  DefaultScrollBarWidth = 0; // вместо 7
{$ENDIF}

Осталось решить проблему "слепой зоны" ползунка при скроллировании внизу списка.

 

PS. Ну и желательно реализовать плавность хода скроллера (

alphLVS.zip

Изменено пользователем Rusland
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...