2009-10-10 5 views
2

Я создаю приложение в чат-комнате, где новые события проходят опрос за каждые X секунд. Каждый раз, когда это происходит, этот код обновляет RoomAdapter (пользовательский подкласс ArrayAdapter) с новыми данными и прокручивается на дно:Обнаружение положения прокрутки внутри ListView (или ScrollView)

RoomAdapter adapter = (RoomAdapter) getListAdapter(); 
for (int i=0; i<newEvents.size(); i++) 
adapter.add(newEvents.get(i)); 
getListView().setSelection(events.size()-1); 

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

Как определить, когда я уже прокручивается в нижней части списка ListView?

Примечание: Я не могу получить getListView(). GetSelectedItemPosition(), потому что as the docs note, вызывая setSelection, когда в режиме касания фактически не выбирает элемент, просто прокручивается к нему.

ответ

6

Я не пробовал, но как насчет getLastVisiblePosition()==getCount()-1? (методы на ListView)

+0

Boom! Вот и все. Я пропустил этот метод. Спасибо! – Konklone

5

Но это не правильно.
Использование
android:transcriptMode
- Поведение списка, когда содержание меняется
- «отключено», не прокручивается
- «нормальный», прокручивается на дно, если последний элемент виден
- «alwaysScroll », всегда прокручивается на дне
android:stackFromBottom
- Stack элементы в обратном порядке
- начинается с последним элементом из адаптера
• Полезно для чатов
- Mess старения, разговора, IRC и т. д.

+0

В то время ответ CommonsWare был по-прежнему правильным, я не думаю, что transcriptMode уже был вокруг. Поэтому я не собираюсь отнимать его принятый ответ. Но спасибо за разъяснение! – Konklone

Смежные вопросы