Я пытаюсь использовать RecyclerView с очень удобным для моих целей ItemTouchHelper.
Все что я хочу - это простые сценарии “drag & drop” и “swipe-to-dismiss”.
Swipe работает корректно, элементы удаляются в адаптере корректно, анимация тоже соответствует происходящему, но “drag & drop” очень странно работает. После long click, элемент не начинает перемещение, хотя выделение срабатывает, а в адаптере вызывается метод onItemMove.
Вот такое странное поведение в моем RecyclerView
И вот чего я пытаюсь добиться
Вот код презентера, onSelectedChanged и clearView тут только для наглядности выделения элементов.
addedCitiesRecycler.setLayoutManager(llmAddedCities);
adapterAddedCities = new AdapterAddedCities();
ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.START | ItemTouchHelper.END) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
adapterAddedCities.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapterAddedCities.onItemDismiss(viewHolder.getAdapterPosition());
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
holder.itemView.setBackgroundColor(Color.LTGRAY);
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
holder.itemView.setBackgroundColor(0);
}
};
itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(addedCitiesRecycler);
Вот пара методов адаптера, изменяющих набор данных и оповещающих RecyclerView о произошедших изменениях.
public void onItemDismiss(int position) {
citiesData.remove(position);
notifyItemRemoved(position);
}
public void onItemMove(int fromPosition, int toPosition) {
CityInfo tmp = citiesData.remove(fromPosition);
citiesData.add(toPosition > fromPosition ? toPosition - 1 : toPosition, tmp);
notifyItemMoved(fromPosition, toPosition);
}
Я запускал проект из
статьи
все работает отлично, не пойму в чем может быть проблема.
Может быть я не учел что-то, связанное c фокусом на передвигаемом элементе или снятии выделения?