2016-08-18 1241 views
5

首先,我整天都在这个工作,但没有做任何事情。我有一个RecyclerView与适配器,使用RecyclerViewSortedList。我试图实现TouchHelper与回调类:notifyItemChanged不刷新视图

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的接口按钮。但是,直到我将视图向外滚动并再次滚动,才会发生这种情况。任何建议我失踪?

Problem case

链接

Adapter class ViewHolder class

+0

不应该在您的项目清单中删除项目时,它被刷新,然后通知适配器? –

+0

'OnItemSwiped'将会调用一个处理程序来移除该项目,就像在Gmail应用程序中一样。 –

+0

我已经更新了代码。 –

回答

1

我创建了一个简单的例子,A​​ndroid应用程序,以便更好地理解这个问题。

它利用notifyItemChanged(position);当用户向左或向右滑动项目以显示撤消视图。撤销时间到期时,它会呼叫notifyItemRemoved(position)将其从列表中删除。以GIF为例,不留空行。

https://github.com/DawidvanGraan/ExampleRecycleViewSwipeDismiss

+0

我已更新代码。 –

+0

昨天我整晚都在看代码,看来我的recyclerview和adapter的实现出了问题,而不是TouchHelperClass –

1

终于得到它运行。由于notifyItemChanged没有切割它(它应该有),所以我使用了notifyItemRemoved,然后是notifyItemInserted

滞留只是一点点,但工程。