Как сделать просмотр списка прокручиваемым, пока последний элемент не окажется в верхней части экрана - PullRequest
4 голосов
/ 29 декабря 2011

Я разрабатываю приложение, которое должно отображать календарную повестку дня, так же, как повестка дня в собственном календаре.У меня есть представление списка, показывающее различные события (Примечание: в контексте вопроса события - это сущность моей системы).Я хочу предоставить кнопку «Сегодня» на этом экране.Когда пользователь нажимает на эту кнопку, события должны прокручиваться до тех пор, пока первое событие текущего дневного графика не появится в верхней части экрана.Проблема возникает, когда у меня запланировано всего несколько событий с сегодняшнего дня - настолько мало, что они не заполняют весь экран.Затем представление списка просто прокручивается, пока последнее событие в календаре не окажется внизу.Обычно это означает, что желаемый эффект от проведения первого сегодняшнего события сверху не достигается.

Есть предложения, как это можно сделать?Я думал о добавлении некоторых пустых элементов в конце, но это кажется уродливым обходным путем, и, кроме того, потребуются специальные вычисления для конкретного устройства, которые подскажут мне, сколько элементов нужно вставить.

Редактировать :
Добавление некоторого кода в соответствии с запросом в комментарии
На самом деле я не уверен, что этот код кого-нибудь удивит, но:

public void onTodayClicked(View target) {
  // calculate the indexOf. It works and is not related to the question
  if (indexOf >= 0) {
     ListView list = (ListView) findViewById(R.id.events_list_view);
     list.setSelection(indexOf);
  }
}

Я не уверен, что определение макетаважно помочь в ответе на вопрос, но если вы так думаете, я тоже могу добавить его.

1 Ответ

0 голосов
/ 30 декабря 2011

Вы можете достичь этого двумя способами:

  1. вызов smoothScrollToPositionFromTop метод
  2. вызов setSelectionFromTop метод

Лучше использовать метод smoothScroll, потому что он фактически выполняет переход плавно - это означает, что он действительно прокручивается к нему. Единственным недостатком является то, что он доступен только после API уровня 11.

Метод setSelectionFromTop работает с уровня API 1, но вместо плавной прокрутки он переходит к строке.

Если вам не нужно располагаться в верхней части экрана, только для просмотра строки, вы также можете использовать smoothScrollToPosition, который является вызовом уровня API 8.


Если вы дадите этим методам позицию, которая является FIRST в списке, они будут работать хорошо. (из вашего описания я думаю, что вы, вероятно, рассчитали последнюю позицию, но я не уверен).

...