2016-01-24 93 views
0

我有一个工作线性RecyclerView通过滑动删除,一切都很好。 但是,当我尝试使用Snackbar.Callback创建“撤消”动作时,出现列表错误,如“无效索引”,该项目被刷掉,然后立即再次出现,甚至出现“不一致检测”错误。任何人在代码中看到奇怪的东西?使用Snackbar.Callback撤销删除操作

 @Override 
     public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) { 
      // item position 
      final int pos = viewHolder.getAdapterPosition(); 
      communicator.remove(pos); 
      recyclerViewAdapter.notifyItemRemoved(pos); 

      Snackbar.make(view, R.string.notice_removed, Snackbar.LENGTH_LONG) 
        .setCallback(new Snackbar.Callback() { 
         @Override 
         public void onDismissed(Snackbar snackbar, int event) { 
          switch (event) { 
           case Snackbar.Callback.DISMISS_EVENT_ACTION: 
            recyclerViewAdapter.notifyItemInserted(pos); 
            break; 
           default: 
            communicator.remove(pos); 
            break; 
          } 
         } 
        }) 
        .setAction(R.string.action_undo, new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // do nothing 
         } 
        }) 
        .show(); 

      recyclerViewAdapter.notifyItemRangeChanged(pos, recyclerViewAdapter.getItemCount()); 
     } 

回答

1

使用final int pos = viewHolder.getAdapterPosition()不是好主意。因为最终原因pos在您的SnackBar CallBack侦听器中包含您需要的错误索引。您可以使用view.getTagview.setTag来保持适配器位置的右侧索引。也许这可以帮助你:

@Override 
    public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) { 
     // hold position in view item 
     int pos = viewHolder.getAdapterPosition(); 
     view.setTag(pos); 
     communicator.remove(pos); 
     recyclerViewAdapter.notifyItemRemoved(pos); 
     //Snackbar.make(view, R.string.notice_removed, Snackbar.LENGTH_SHORT).show(); 
     Snackbar.make(view, R.string.notice_removed, Snackbar.LENGTH_LONG) 
       .setCallback(new Snackbar.Callback() { 
        @Override 
        public void onDismissed(Snackbar snackbar, int event) { 
         //get position from view item of snackbar that you set it before. 
         int position = (int)snackbar.getView().getTag(); 
         switch (event) { 
          case Snackbar.Callback.DISMISS_EVENT_ACTION: 
           recyclerViewAdapter.notifyItemInserted(position); 
           break; 
          default: 
           communicator.remove(position); 
           break; 
         } 
        } 
       }) 
       .setAction(R.string.action_undo, new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         // do nothing 
        } 
       }) 
       .show(); 

     recyclerViewAdapter.notifyItemRangeChanged(pos, recyclerViewAdapter.getItemCount()); 
    } 
+0

嘿@Majid,'pos'在你的代码贴出does not看起来那么初始化如何'setTag(对象)'影响的代码? – Frank

+0

行@Frank,你说得对。我编辑了代码。您必须在CallBack方法中使用'position'变量。 –

+0

我需要在Snackbar回调方法中访问它,以便IDE需要它是最终的。其他解决方案? – Frank