2016-01-24 91 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