Статьи

Android ListView Pull-to-Refresh

В этом посте я хочу описать, как создать собственный виджет 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
@Override
public 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();
}

улучшения

Одна вещь, которую мы можем улучшить, это когда состояние обновления уже запущено, и мы не хотим запускать его снова. Для этого мы просто используем внутренний логический атрибут. Еще одна важная вещь – адаптировать порог к реальному размеру экрана и точкам на дюйм. Конечно, это не полная библиотека, готовая к использованию, но она может дать некоторые подсказки.

Ссылка: Android ListView Pull-to-Refresh от нашего партнера JCG Франческо Аццолы в блоге Surviving с Android .