Раніше я працював у бібліотеці SwipeToDismiss, але зараз я намагаюся перейти на RecyclerView, і все не так очевидно, чи знаєте ви якісь заміни для цієї бібліотеки? Будь-які ідеї, як реалізувати це з нуля?
Раніше я працював у бібліотеці SwipeToDismiss, але зараз я намагаюся перейти на RecyclerView, і все не так очевидно, чи знаєте ви якісь заміни для цієї бібліотеки? Будь-які ідеї, як реалізувати це з нуля?
Відповіді:
Станом на v22.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);
viewHolder
.
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, то пункт буде видалено з бази даних, а перегляд рецилер буде оновлений, а якщо користувач вибере CANCEL, тоді reciklierview буде таким, яким він є.
if (direction == ItemTouchHelper.LEFT) // if swipe left
оскільки ItemTouchHelper.SimpleCallback
обмеження обмежується лише цим напрямком пальця. Якщо ви хочете пальцями ліворуч і праворуч, ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)
тоді вам потрібно буде перевірити напрямок.
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // stuff to put the item back } });
adapter.notifyItemChanged(position);
повернув перевезений предмет, а не notifyItemRemoved
- що більш логічно.
можливо, ви можете спробувати цю бібліотеку:
https://github.com/daimajia/AndroidSwipeLayout
Оновлення. Щойно я знайшов ще одну хорошу бібліотеку, яку можна використовувати з RecyclerView:
Ця бібліотека може бути корисною. Ви можете впроваджувати її undo
у OnDissmiss
використанніsupertoast
OnTouchListener
натхнення цим
Я написав бібліотеку SwipeToDeleteRV, яка підтримує функцію "проведіть пальцем для видалення-скасування" на переглядах рециркулятора. Він заснований на ItemTouchHelper і дуже простий у використанні.
Сподіваюся, це може бути корисним для тих, хто стикається з тими ж проблемами.
Як приклад, ви можете визначити перегляд рециркулятора в макеті 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);
Це воно! Для отримання більш розширених налаштувань (тобто встановлення різних повідомлень про видалення для різних елементів, тимчасово та назавжди видаліть елементи, ...), будь ласка, зверніться до сторінки проекту readme.