2015-08-13 1 views
0

J'ai implémenté la fonction glisser et supprimer dans mon RecyclerView. Mais le problème est que lorsque je supprime l'élément, l'élément précédent se lève, et en dessous de cet élément je vois le même élément quelques secondes, mais après avoir supprimé un seul élément visible (précédent) J'ai également essayé d'utiliser adapter.notifyDataSetChanged() Lorsque j'ai balancé l'élément, je peux voir cet élément quelques secondes dans la position précédente, et après moins de 1 seconde, l'élément est en cours de suppression.Pourquoi notifyItemRemoved fonctionne-t-il lentement?

Ainsi, par exemple, j'ai liste

  1. Liste Item1
  2. Liste item2

Après swipe et appeler notifyItemRemoved() et je vois cette liste 1 sec

  1. Liste item2
  2. Liste item2

Et finaly

  1. Liste item2

Voici le code

ItemTouchHelper swipeToDismissTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
      ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { 
     @Override 
     public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
      // callback for drag-n-drop, false to skip this feature 
      return false; 
     } 

     @Override 
     public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
      // callback for swipe to dismiss, removing item from data and adapter 
      int itemPosition = viewHolder.getAdapterPosition(); 
      Log.v("Position", Integer.toString(itemPosition)); 
      adapter_.removeItem(itemPosition); 
     } 
    }); 
    swipeToDismissTouchHelper.attachToRecyclerView(chatsRecyclerView_); 

Et ici méthode dans mon adaptateur

public void removeItem(int position){ 
    Cursor cursor = getCursor(); 
    if (cursor.getCount() != 0) { 
     Log.v("Size", Integer.toString(cursor.getCount())); 
     cursor.moveToPosition(position); 
     String chatIdOnServer = cursor.getString(cursor.getColumnIndex(MegaFleetDatabaseOpenHelper.ChatsTable.ID_ON_SERVER)); 
     context_.startService(ChatsInfoUpdateService.createLeaveChatIntent(this.context_, chatIdOnServer)); 
     ChatsTableHelper.deleteChat(this.context_, chatIdOnServer); 
     // this.notifyDataSetChanged(); 
     this.notifyItemRemoved(position); 
    } 
} 

Répondre

0

La solution consiste à appeler swapCursor() après la suppression de l'élément. Dans ce cas, tout fonctionne bien.

@Override 
     public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
      // callback for swipe to dismiss, removing item from data and adapter 
      int itemPosition = viewHolder.getAdapterPosition(); 
      Log.v("Position", Integer.toString(itemPosition)); 
      adapter_.removeItem(itemPosition); 
      adapter_.swapCursor(ChatsTableHelper.getAllChatsInfo(ChatListActivity.this)); 
     } 
    });