2015-08-13 5 views
0

Я реализовал функцию удаления и удаления в моем RecyclerView. Но проблема в том, что когда я удаляю элемент, предыдущий элемент поднимается вверх, а ниже этого элемента я вижу один и тот же элемент за несколько секунд, но после удаления только одного элемента (предыдущий). Также я попытался использовать adapter.notifyDataSetChanged(), но когда я вытащил элемент, я могу увидеть этот элемент на несколько секунд в предыдущей позиции и после удаления элемента менее 1 секунды.Почему notifyItemRemoved работает медленно?

Так, например, у меня есть список

  1. Список item1
  2. Список item2

После салфетки и вызвать notifyItemRemoved() и я вижу такой список 1 сек

  1. Список item2
  2. Элемент списка2

И, наконец

  1. Список item2

Вот код

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_); 

А вот метод в моем адаптере

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); 
    } 
} 

ответ

0

Решение заключается в вызове swapCursor() после удаления элемента. В этом случае все работает нормально.

@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)); 
     } 
    }); 
Смежные вопросы