RecyclerView повреждает представление, используя notifyItemMoved ()
У меня проблема с использованиемnotifyItemMoved()
метод. Кажется, неправильно отображаются неподвижные виды.
В моем списке 4 элемента. То, что я хочу сделать, это анимировать обмен между элементом 1 и пунктом 3. Элементы 1 и 3 меняются правильно, но пункт 2 отображает то, что было в пункте 3!
Итак, список начинается примерно так:
Item 0
Item 1
Item 2
Item 3
И заканчивается так:
Item 0
Item 3
Item 3 <!-- What the heck has this changed for?
Item 1
Мой адаптер поддерживаетсяList mProductList
, Я называю следующий код:
public void sortBackingListUsingSortingList(List<ProductWrapper> newProductItems) {
Log.e("", "Before:");
for(ProductWrapper wrapper : mProductItems) wrapper.log();
for(int i = 0; i < newProductItems.size(); i++) {
ProductWrapper currentItem = mProductItems.get(i);
ProductWrapper correctItem = newProductItems.get(i);
if(!currentItem.equals(correctItem)) {
// Item in wrong place
int indexOfCorrectItem = getIndexOfItemInList(mProductItems, correctItem);
Collections.swap(mProductItems, i, indexOfCorrectItem);
notifyItemMoved(i, indexOfCorrectItem);
Log.e("", "notifyItemMoved(" + i + ", " + indexOfCorrectItem+")");
Log.e("", "After:");
for(ProductWrapper wrapper : mProductItems) wrapper.log();
}
}
}
Я также добавил запись вonBindViewHolder
чтобы проверить, вызывается ли моя логика вида:
@Override
public void onBindViewHolder(HolderBasic holder, int position) {
Log.e("", "onBindViewHolder(holder, " + position + ")");
holder.fill(mProductItems.get(position));
}
Мои журналы выглядят так:
09-02 14:39:17.853 ﹕ Before:
09-02 14:39:17.853 : Item 0
09-02 14:39:17.853 : Item 1
09-02 14:39:17.853 : Item 2
09-02 14:39:17.853 : Item 3
09-02 14:39:17.854 ﹕ notifyItemMoved(1, 3)
09-02 14:39:17.854 ﹕ After:
09-02 14:39:17.854 : Item 0
09-02 14:39:17.854 : Item 3
09-02 14:39:17.854 : Item 2
09-02 14:39:17.854 : Item 1
09-02 14:39:17.867 ﹕ onBindViewHolder(holder, 1)
09-02 14:39:17.874 ﹕ onBindViewHolder(holder, 3)
Как вы можете видеть, у Item 2 нет никаких причин изменять его отображение - и тем не менее, это так. Кто-нибудь знает почему?
РЕДАКТИРОВАТЬ
Я могу обойти выше, проходя через весь адаптер и вызываяnotifyItemChanged()
на каждом предмете. Неэффективное и не хорошее решение, но невидимое для пользователя.