Как 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, если вы его не сохраните, как только вы нажмете, он будет перерисовываться с видом спереди и без анимации.