2016-08-18 4 views
5

Прежде всего, я работал над этим весь день, но ничего не мог сделать. У меня есть 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 кнопка. Но этого не происходит, пока я не прокручу представление и не прокручу его назад. Любые предложения, что мне не хватает?

Problem case

Ссылки

Adapter class ViewHolder class

+0

Вам не следует удалять элемент из списка товаров, когда он проскачен, а затем уведомить адаптер? –

+0

'OnItemSwiped' вызовет обработчик для удаления элемента позже, как и в приложении gmail. –

+0

Я обновил код. –

ответ

1

Я создал простой пример Android App, чтобы лучше понять вопрос.

Используется notifyItemChanged (position);, когда пользователь просматривает элемент влево или вправо, чтобы показать отменить. По истечении времени отмены оно вызывает notifyItemRemoved (position), чтобы удалить его из списка. См. Например, GIF, не оставляет пустых строк.

https://github.com/DawidvanGraan/ExampleRecycleViewSwipeDismiss

+0

Я обновил код. –

+0

Я вчера смотрел код вчера, и, похоже, что-то не так с моей реализацией recyclerview и адаптера, а не с TouchHelperClass –

1

Наконец получил это работает. Поскольку notifyItemChanged не резал его (что должно было), я использовал notifyItemRemoved, а затем notifyItemInserted.

Отступает немного, но работает.

 Смежные вопросы

  • Нет связанных вопросов^_^