Прежде всего, я работал над этим весь день, но ничего не мог сделать. У меня есть RecyclerView
с адаптером, который использует RecyclerView
's SortedList
. Я попытался реализации TouchHelper
с классом обратного вызова:notifyItemChanged не refreshing view
public class TimerListTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
private OnItemChangeListener onItemChangeListener;
public TimerListTouchHelperCallback(OnItemChangeListener listener, int dragDirs, int swipeDirs) {
super(dragDirs, swipeDirs);
this.onItemChangeListener = listener;
}
@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
TimerHolder holder = (TimerHolder) viewHolder;
int holderState = holder.getState();
if (holderState == TimerHolder.TIMER_PENDING_DELETE) return 0;
else return super.getSwipeDirs(recyclerView, viewHolder);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
TimerHolder holder = (TimerHolder) viewHolder;
int position = holder.getAdapterPosition();
// ViewHolder's state is changed that should handle the layout change.
holder.setState(TimerHolder.TIMER_PENDING_DELETE);
if (onItemChangeListener != null) onItemChangeListener.onItemSwiped(position);
}
protected interface OnItemChangeListener{
void onItemSwiped(int position);
}
}
Вот инициализация TouchHelper
timerAdapter = new TimerAdapter(this, timerList);
timerListView.setAdapter(timerAdapter);
TimerListTouchHelperCallback touchHelperCallback = new TimerListTouchHelperCallback(
timerAdapter,
ItemTouchHelper.LEFT,
ItemTouchHelper.LEFT);
ItemTouchHelper swipeToDismissTouchHelper = new ItemTouchHelper(touchHelperCallback);
swipeToDismissTouchHelper.attachToRecyclerView(timerListView);
Мой адаптер реализует интерфейс OnItemChangeListener
@Override
public void onItemSwiped(int position) {
notifyItemChanged(position);
removalPendingTimers.add(timerList.get(position));
}
Мои ViewHolder
читает состояние и когда состояние TimerHolder.TIMER_PENDING_DELETE
скрывает остальную часть представления и показывает интерфейс с помощью un do кнопка. Но этого не происходит, пока я не прокручу представление и не прокручу его назад. Любые предложения, что мне не хватает?
Ссылки
Adapter class ViewHolder class
Вам не следует удалять элемент из списка товаров, когда он проскачен, а затем уведомить адаптер? –
'OnItemSwiped' вызовет обработчик для удаления элемента позже, как и в приложении gmail. –
Я обновил код. –