Как сделать перемещаемые элементы
Увидел одну очень интересную настройку в приложении, пытался искать в интернете, но не знаю как правильно называется данная штучка, подскажите новичку), желательно не только название а ещё и простой пример как её реализовать.
Ответы (2 шт):
Эта штука называется ItemTouchHelper.
Реализуется примерно так:
public class RecyclerListAdapter extends RecyclerView.Adapter<ItemViewHolder> implements ItemTouchHelperAdapter {
// ...
@Override
public void onItemDismiss(int position) {
mItems.remove(position);
notifyItemRemoved(position);
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
BbCollections.swap(mItems, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mItems, i, i - 1);
}
}
notifyItemMoved(fromPosition, toPosition);
return true;
}
Здесь можно почитать больше. Ещё можно заглянуть в документацию
В мире взаимодействия с сенсорными экранами есть несколько понятий, некоторые из них Touch, DoubleTouch, Swipe, Drag and Drop. Вас интересует Drag-and-drop (D&D, DnD, DND, в переводе с английского означает буквально тащи-и-бросай; Бери-и-Брось).
Реализовать данный функционал можно различными способами, от современного решения с ItemTouchHelper, до более простых решений в виде сторонних библиотек. Лично я имею опыт использования этой библиотеки https://github.com/ernestoyaquello/DragDropSwipeRecyclerview у неё понятная документация, а так же она позволит помимо перемещения объектов, реализовать удаление по свайпу. Прошу заметить, что вам необходимо быть знакомым с реализацией отображения списка элементов через RecyclerView.
Если кратко для реализации списка с использованием RecyclerView вам понадобится Активити или Фрагмент содержащий в своей разметке <androidx.recyclerview.widget.RecyclerView/> или <android.support.v7.widget.RecyclerView/> (Если вы решили использовать мою рекомендацию по библиотеке используйте <com.ernestoyaquello.dragdropswiperecyclerview.DragDropSwipeRecyclerView/>)
В коде активити или фрагмента задайте лаяут менеджер recyclerView.layoutManager = LinearLayoutManager(this). А также присвойте адаптер recyclerView.adapter = adapter, это должен быть созданный вами наследник RecyclerView.Adapter<Ваш адаптер.Holder>() или в случаи реализации через библиотеку DragDropSwipeAdapter<Ваша сущность, Ваш адаптер.Holder>(список ваших сущностей).
Задача адаптера поместить данные в вашу сущность и затем recyclerView возьмет на себя обязанности по оптимизированной отрисовке вашего списка. Как вы могли заметить адаптер содержит в себе Holder, это наследник RecyclerView.ViewHolder(view) который содержит в себе вашу view элемента списка. Другими словами адаптер заполнит view данными из вашей сущности и будет хитрым образом отрисовывать их. Возможности безграничны, у вас наверняка будут возникать вопросы, я хотел направить вас на слова которые погут вам в дальнейших поисках. Удачи!
