2015-12-17 3 views
1

У меня возникла проблема с RecyclerView и RecyclerView.Adapter. У меня есть функция, которая устанавливает список элементов в адаптер. Когда пользователь перебирает-обновлять, я загружаю свежие данные, что означает, что некоторые элементы являются новыми, а затем я устанавливаю элементы в адаптер, и я должен их аннулировать. Моя проблема заключается в notifyItemRangeInserted() и notifyItemRangeChanged(). Когда появятся новые элементы, если я их сначала удалю, то notifyItemRangeRemoved(), затем добавьте и, наконец, вызовите notifyItemRangeInserted(), это сработает, но все элементы недействительны и мигают. В противном случае, если я определяю разницу в размере между новым и старым набором данных, это не делает недействительными правильные элементы.Обновление элементов адаптера Android RecyclerView

public void setItems(@NonNull List<ItemType> items) { 
     final int oldSize = mItems.size(); 
     mItems.clear(); 
     notifyItemRangeRemoved(firstPosition(), oldSize); 
     mItems.addAll(items); 
     notifyItemRangeInserted(firstPosition(), items.size()); 
} 

mItems ArrayList.

+0

Что такое 'firstPosition'? \ – Blackbelt

+0

firstPosition() проверяет, имеет ли адаптер заголовок. Если заголовок присутствует, он будет равен 1 в противном случае 0. Я решил эту текущую проблему, выполнив 'notifyItemRangeInserted (firstPosition(), oldSize);' но проблема обновления только крошечного фрагмента элементов не решена без предварительного удаления старого пунктов, а затем применить новые. Таким образом, мигание будет присутствовать, но это приемлемо для моего текущего решения. – John

ответ

0

Резолюция должна была использовать в адаптере hasStableIds(), чтобы адаптер мог узнать, какие элементы были изменены.

1

Не могли бы вы попробовать этот?

myRecycleAdapter.notifyItemInserted (items.size());

Ваш метод будет выглядит, как показано ниже:

public void setItems(@NonNull List<ItemType> items) { 
    mItems.clear(); 
    mItems.addAll(items); 
    myRecycleAdapter.notifyItemInserted(items.size()); 

}

Надеется, что это поможет вам.

0

Я думаю, что, может быть, вы перевыполняете ситуацию.

Подобный ответ Hiren, вы можете просто:

public void setItems(@NonNull List<ItemType> items) { 
    mItems.clear(); 
    mItems.addAll(items); 
    myRecycleAdapter.notifyDataSetChanged(); } 

NotifyDataSetChanged не будет ни вызывать мерцающий эффект и не более список из его текущей позиции.

Смежные вопросы