Рассчитать высоту полосы прокрутки в сетке с различной высотой строки - PullRequest
1 голос
/ 19 августа 2011

У меня есть сетка с большим количеством строк (например, 1 000 000).Высота каждого ряда может быть уникальной.Но большинство рядов имеет одинаковую высоту.Поэтому невозможно определить высоту каждой строки и получить общую высоту сетки.

Мне нужно реализовать плавную вертикальную прокрутку по этой сетке, а не только перепрыгивать через строку, потому что строка может быть выше видимой области.

Мое решение:

  1. получить количество строк
  2. каждая строка разделена на 10 частей
  3. => максимальное значение полосы прокрутки равно (количество строк) * 10
  4. из позиции прокрутки я получаю:
    • первая видимая строка = (позиция прокрутки) / 10
    • смещение первой видимой строки = (позиция прокрутки)% 10

Это прекрасно работает, если все строки имеют + - одинаковую высоту.Если есть одна строка высотой 500 пикселей, а другая имеет 25 пикселей, прокрутка выглядит ужасно.

Кто-нибудь предлагал, как лучше решить эту проблему?

Сетка здесь: http://img560.imageshack.us/img560/7775/scroll.png

1 Ответ

0 голосов
/ 19 августа 2011

Позвольте прокрутке быть в пиксельных единицах:

  • Суммируйте общую высоту всех строк и установите максимальное значение полосы прокрутки в это значение.
  • Кэшируйте первый видимый индекс строкив переменной.
  • Когда пользователь прокручивает вверх или вниз, вы можете сканировать последовательно от текущей первой видимой строки, чтобы найти новую.Это дает амортизированную работу с постоянным временем на обновление для последовательного чтения.
  • Вы не будете делать произвольный доступ (например, прокручивать к номеру строки N) часто, поэтому линейный поиск, когда вы делаете это нормально.Если вам нужно что-то более быстрое (я сомневаюсь в этом), то вы можете предварительно вычислить частичные суммы высоты строк и выполнить бинарный поиск.
...