В этом посте я хочу описать, как создать собственный виджет ListView, который ведет себя как список Gmail, так что когда вы скользите вниз и находитесь в верхней части списка, он обновляется . Этот новый шаблон пользовательского интерфейса известен как Pull-to-refresh . Есть несколько реализаций, это моя собственная версия.
Чтобы иметь такое поведение, мы должны создать пользовательский компонент, чтобы иметь полный контроль. Итак, мы должны:
- Создайте пользовательский компонент, который расширяет стандартный виджет ListView.
- Создать пользовательский адаптер (необязательно)
- Создать интерфейс (слушатель)
Создание пользовательского компонента
Первое, что нам нужно сделать, — это создать собственный виджет, который расширяет виджет ListView и реализует раскрывающийся список для обновления функциональности. Мы должны помнить, что мы должны сохранить все поведения в стандартном ListView. Первое, что мы должны рассмотреть, это когда происходит обновление элементов представления списка. Есть два условия, которые должны быть выполнены:
- Мы находимся в верхней части списка, другими словами, первый элемент виден
- Пользователь должен коснуться и сдвинуть палец вниз с длиной пути, превышающей указанный порог
Для достижения этих требований мы должны переопределить onTouchEvent, и в этом методе мы должны проверить, выполнены ли эти условия.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@Overridepublic boolean onTouchEvent(MotionEvent event) { //System.out.println("First ["+this.getFirstVisiblePosition()+"]"); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_MOVE: { if ( ( y - startY) > THRESHOLD && STATE_REFRESH_ENABLED && !STATE_REFRESHING ) { } } break; case MotionEvent.ACTION_DOWN: { startY = y; STATE_REFRESH_ENABLED = getFirstVisiblePosition() == 0; // We are on the first element so we can enable refresh } case MotionEvent.ACTION_UP: { STATE_REFRESHING = false; } } return super.onTouchEvent(event);} |
В частности, когда пользователь впервые касается экрана (MotionEvent.ACTION_DOWN) в строке 13-15, мы должны проверить, какой элемент видим, используя getFirstVisiblePosition () . Если результат этого метода равен 0, то мы можем включить состояние обновления и проверить, перемещает ли пользователь вниз по его пальцу. В то же время мы сохраняем координаты у на сенсорном экране. Затем мы проверяем, перемещает ли пользователь палец вниз, перехватывая событие MotionEvent.ACTION_MOVE (строки 8-9). Пока пользователь перемещает палец вниз, а длина пути превышает предварительно настроенное пороговое значение, мы можем вызвать событие обновления.
Реализуйте событие обновления
Как только все условия выполнены, мы можем запустить событие обновления. Чтобы уведомить вызывающего абонента о том, что пользователь хочет обновить список, мы можем использовать простой интерфейс только с одним методом, поэтому, если вызывающий объект реализует этот интерфейс и регистрирует себя в качестве прослушивателя, он будет уведомлен, когда должно произойти обновление.
|
1
2
3
|
public interface OnRefreshListListener { public void onRefresh();} |
улучшения
Одна вещь, которую мы можем улучшить, это когда состояние обновления уже запущено, и мы не хотим запускать его снова. Для этого мы просто используем внутренний логический атрибут. Еще одна важная вещь — адаптировать порог к реальному размеру экрана и точкам на дюйм. Конечно, это не полная библиотека, готовая к использованию, но она может дать некоторые подсказки.
