Я использовал SwipeToDismiss, но теперь я пытаюсь перейти на RecyclerView, и все не так очевидно, знаете ли вы какие-либо замены для этой библиотеки? Любые идеи, как реализовать его с нуля?
Проведите по экрану для RecyclerView
Ответ 1
Начиная с версии 22.2.0, группа поддержки Android включила класс ItemTouchHelper
, который упрощает прокрутку и удаление и перетаскивание. Возможно, это не так полно, как некоторые из библиотек, но это происходит непосредственно из команды Android.
-
Обновите файл build.gradle для импорта v22.2. + в библиотеку RecyclerView
compile 'com.android.support:recyclerview-v7:22.2.+'
-
Создайте экземпляр ItemTouchHelper с помощью соответствующего SimpleCallback
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { [...] @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { //Remove swiped item from list and notify the RecyclerView } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
** Обратите внимание, что SimpleCallback принимает направления, которые вы хотите включить перетаскивание и направления, которые вы хотите включить.
-
Прикрепите к вашему RecyclerView
itemTouchHelper.attachToRecyclerView(recyclerView);
Ответ 2
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition(); //get position which is swipe
if (direction == ItemTouchHelper.LEFT) { //if swipe left
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
builder.setMessage("Are you sure to delete?"); //set message
builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position); //item removed from recylcerview
sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
list.remove(position); //then remove item
return;
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { //not removing items if cancel is done
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position + 1); //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
adapter.notifyItemRangeChanged(position, adapter.getItemCount()); //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
return;
}
}).show(); //show alert dialog
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
Здесь, в коде, если пользователь прокручивается влево, отображается AlertDialog, и если пользователь выбирает REMOVE, тогда элемент удаляется из базы данных, а recyclerview обновляется, и если пользователь выбирает CANCEL, то recyclerview выглядит так, как есть.
Ответ 3
возможно, вы могли бы попробовать эту библиотеку:
https://github.com/daimajia/AndroidSwipeLayout
Обновление: Я только что нашел другую хорошую библиотеку, которую вы можете использовать с RecyclerView:
Ответ 4
Эта библиотека может быть полезна. Вы можете реализовать undo
в OnDissmiss
использовать supertoast
Ответ 5
Я написал SwipeToDeleteRV библиотеку, которая поддерживает функцию отладки-удаления-отмены на просмотрах recycler. Он основан на ItemTouchHelper и очень прост в использовании.
Надеюсь, что это может быть полезно для тех, кто сталкивается с теми же проблемами.
В качестве примера вы можете определить представление recycler в формате XML как обычно, а также некоторые необязательные атрибуты:
...
xmlns:stdrv="http://schemas.android.com/apk/res-auto"
...
<io.huannguyen.swipetodeleterv.STDRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
stdrv:border_color="@android:color/darker_gray" // specify things like border color, border width, etc.
stdrv:delete_view_background="#cccccc"
stdrv:delete_icon="@drawable/ic_archive"
stdrv:delete_icon_height="24dp"
stdrv:delete_icon_width="24dp"
stdrv:left_delete_icon_margin="32dp"
stdrv:delete_message="@string/delete_message"
stdrv:right_delete_icon_margin="32dp"
stdrv:delete_icon_color="#000000"
stdrv:has_border="true"/>
Все атрибуты stdrv являются необязательными. Если вы не укажете их, будут использоваться значения по умолчанию.
Затем создайте адаптер, который подклассифицирует STDAdapter, убедитесь, что вы вызываете конструктор суперкласса. Что-то вроде этого:
public class SampleAdapter extends STDAdapter<String> {
public SampleAdapter(List<String> versionList) {
super(versionList);
}
}
Затем убедитесь, что вы вызываете метод setupSwipeToDelete
, чтобы установить функцию перетаскивания для удаления.
mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);
swipe_directions
- это направление, в котором вы разрешаете элементы.
Пример:
// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
Что это! Для более продвинутых настроек (то есть, установите разные сообщения об удалении для разных элементов, временно и навсегда удалите элементы...), пожалуйста, обратитесь к странице просмотра проекта.