ItemTouchHelper, Root, AsyncTask, Genymotion. Удаляем приложения.

Урок 18 — ItemTouchHelper, Root, AsyncTask, Genymotion. Удаляем приложения.

В этом уроке мы добавим возможность удаления приложения, рассмотрим работу с ItemTouchHelper, Root, эмулятором Genymotion и выполнением задач в фоне.

ItemTouchHelper

Несколько уроков назад мы работали с ItemDecoration — добавляли разделители в RecyclerView. Сейчас же мы рассмотрим иное применение ItemDecoration.

ItemTouchHelper — класс, наследующийся от ItemDecoration и позволяющий обрабатывать такие события, как Swipe to Dismiss (смахивание влево или вправо) и Drag and Drop. Мы рассмотрим первый вариант: когда пользователь тащит элемент списка (то есть приложение) в сторону, мы удаляем это приложение. Это очень популярный паттерн, который можно увидеть, к примеру, в любом почтовом клиенте.

Использовать его очень легко: во-первых, нужно реализовать интерфейс ItemTouchHelper.Callback, во-вторых — создать новый инстанс ItemTouchHelper, в-третьих — прицепить его к RecyclerView. Давайте же начнём :)

В самом конце класса MainActivity реализуйте интерфейс ItemTouchHelper.Callback:

private final ItemTouchHelper.Callback itemTouchHelperCallback = new ItemTouchHelper.Callback() {

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return 0;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    }

};

Рассмотрим методы этого интерфейса:

  • getMovementFlags() — этот метод вызывается, когда пользователь начинает тянуть ячейку. В нём мы должны вернуть значение, согласно которому система будет позволять или запрещать выполнить какое-то действие. Например, мы можем разрешить свайпы только в одну сторону и запретить перемещение ячеек. Обратите внимание на второй аргумент: благодаря тому, что нам передаётся ViewHolder, с которым производится действие, мы можем разрешить или запретить действия для определённой ячейки, основываясь на данных, которые отображает данная ячейка. Например, мы можем запретить удалять системные приложения.
  • onMove() — вызывается, когда пользователь переместил ячейку. Вторым аргуметром передаётся ViewHolder ячейки, которую переместили, а третьим — ViewHolder ячейки, на которую произошло перетаскивание.
  • onSwiped() — вызывается, когда пользователь завершил жест "свайп". Первым аргументом передаётся ViewHolder ячейки, которую свайпнули, а вторым — направление свайпа.

На данный момент нам нужно подправить только метод getMovementFlags().

Мы не будем разрешать перемещать ячейку, а разрешим только свайп слева направо. Сконвертировать наши пожелания в конкретный флаг поможет метод ItemTouchHelper.Callback.makeMovementFlags().

Первым аргументом мы сообщаем, разрешаем ли перемещения ячейки, а вторым — разрешаем ли свайпы. Итого, метод будет выглядеть вот так:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    return makeMovementFlags(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.END);
}
  • ItemTouchHelper.ACTION_STATE_IDLE сообщает, что действие запрещено, так как мы не позволяем перемещать ячейку.
  • ItemTouchHelper.END говорит о том, что мы разрешаем перемещение ячейки "в конец" — слева направо на LTR локалях и справа налево на RTL локалях.

Теперь идём в метод onCreate() и в конце, перед строчкой

reloadApps();

Вставляем следующий код:

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
recyclerView.addItemDecoration(itemTouchHelper);
itemTouchHelper.attachToRecyclerView(recyclerView);

В первой строке мы создаём ItemTouchHelper, передавая ему только что созданный нами Callback.

Во второй строчке добавляем ItemTouchHelper в качестве ItemDecoration (так же, как делали с разделителями).

В третьей строчке мы "прикрепляем" ItemTouchHelper к RecyclerView. Вот и всё!

Запустите приложение и попробуйте свайпнуть слева направо. Одна ячейка уедет вправо и исчезнет, оставив после себя пустое пространство:

Свайп с использованием ItemTouchHelper
Свайп с использованием ItemTouchHelper

Получилось!

Само собой, сейчас ничего не удаляется. Нужно добавить ещё немного кода, чтобы удаление заработало. Как вы помните, в методе onSwiped() мы получаем ViewHolder той ячейки, которую свайпнули.

Из ViewHolder нам нужно как-то получить информацию о приложении, потому что просто от ViewHolder толку не очень много :)

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


Продолжение доступно на платных тарифах

Это недорого — всего от 440 ₽ в месяц!


ВЫБРАТЬ ТАРИФ


Продолжение доступно после регистрации

Все уроки на сайте доступны абсолютно бесплатно после регистрации.

Регистрация займёт меньше минуты ;)