Как RecyclerView ItemTouchHelper блокирует салфетки?

Я использую RecyclerView с ItemTouchHelper, чтобы выполнить очистку для удаления, и добавьте кнопку удаления под элементом прокрутки следующим образом: Спектр прокрутки

Но когда я закончу прокрутку, элемент скоро будет удален из списка! Как я могу заблокировать вытащенный предмет и удалить его, нажав кнопку "Удалить"? Также как поведение Gmail.

пс. Я оставляю те же вопросы здесь https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=189057

Ответ 1

Просто следуйте примеру "Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java" и сделайте небольшое изменение в методе "onChildDraw"

public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
        RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
        boolean isCurrentlyActive) {
    float translationX = Math.min(-dX, viewHolder.itemView.getWidth() / 2);
    viewHolder.itemView.setTranslationX(-translationX);
    return true;
}

Этот метод должен возвращать значение true, иначе ItemTouchUIUtil переопределит значение переводаX Снимок экрана

Ответ 2

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    float translationX;
    if(dX > 0){
      translationX = Math.min(-dX, viewHolder.itemView.getWidth() / 2);
    }
    else {
       translationX = Math.max(dX, (-1)* viewHolder.itemView.getWidth() / 2);
    }
    super.onChildDraw(c, recyclerView, viewHolder, translationX, dY, actionState, isCurrentlyActive);
}

Ответ 3

На SimpleCallback

Установите OnClickListeners на getMovementFlags(), а затем:

public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    if (dX > ARCHIVE_LAYOUT_WIDTH) {
        getDefaultUIUtil().onDraw(c, recyclerView, ((YOUR_VIEW_HOLDER) viewHolder).getSwipableView(), dX, dY, actionState, isCurrentlyActive);
    }
}

Это не самое чистое решение, но оно поможет вам ближе.

Ответ 4

Решения, предлагаемые до этого поста, составляют только 1/5 конечного эффекта.

К сожалению, они работают только при прокрутке, чтобы открыть 1 элемент, но когда вы его закрываете, вам нужно восстановить количество dX, которое вы получаете от параметра, пока не достигнете порога. Затем, когда вы отпускаете, вы снова видите элемент, начиная с середины, потому что реальный dX, который вы получаете, все еще указывает на середину! Действительно уродливый сбой.

Я считаю, что ItemTouchHelper работает только для полного прокрутки 1 элемента за раз. Если нет способа прекратить получение dX, который больше требуемой ширины, вам необходимо решить следующую проблему:

  • Вам нужно добавить сложную логику, чтобы узнать, для какого пункта относится обращение.
  • Если вы пролистаете эффект салфетки, также теряется.
  • Наконец, вы не можете щелкнуть по заднему виду, вам нужно следить за тем, чтобы элемент находился в позиции swiped, если вы его не сохраните, как только вы нажмете, он будет перерисовываться с видом спереди и без анимации.