Когда я использую это, он удаляет один элемент с анимацией
{
notificationItems.remove(0);
adapterForNotification.notifyItemRemoved(0);
adapterForNotification.notifyItemRangeRemoved(0,count-1);
}
Но когда я использую это, он удаляет все элементы без анимации.
count = adapter.getItemCount();
for(int i = 0 ; i < count; ++i){
notificationItems.remove(0);
adapterForNotification.notifyItemRemoved(0);
adapterForNotification.notifyItemRangeRemoved(0,count-1)
}
Вы не должны использовать одновременно notifyItemRemoved() и notifyItemRangeRemoved(). Используйте только по одному.
Если вы хотите удалить один элемент:
notificationItems.remove(index);
adapterForNotification.notifyItemRemoved(index);
Если вы хотите удалить все элементы:
int origCount = notificationItems.size();
notificationItems.clear();
adapterForNotification.notifyItemRangeRemoved(0, origCount - 1);
Если вы хотите удалить ряд элементов:
notificationItems.subList(startIndex, endIndex).clear();
adapterForNotification.notifyItemRangeRemoved(startIndex, endIndex);
Обновлено:
Если вы хотите удалить каждый элемент один за другим и показать анимацию удаления для каждого, попробуйте следующее:
for (int i = 0; i < notificationItems.size(); i++) {
notificationItems.remove(i);
adapterForNotification.notifyItemRemoved(i);
}
Попробуйте с notifyItemRangeRemoved(0, notificationItems.size() - 1).
Приложение прекращено
Поделитесь трассировкой стека.
java.lang.IndexOutOfBoundsException: обнаружено несоответствие. Недопустимая позиция элемента 6 (смещение: 6) .state: 7 android.support.v7.widget.RecyclerView {425ba5d VFED ..... .F .... ID 16,0-696,1084 # 7f0a012d app: id / notification_recyclerview}, адаптер: Adapters.RecyclerViewAdapterForNotification@db406ca, макет: android.support.v7.widget.LinearLayoutManager@9f4a03b, контекст: ********. NotificationActivity @ 557b5b1 на android.supportRecycler.widget. $ Recycler.tryGetViewHo lderForPositionByDea dline (RecyclerView.j ava: 5817)
Я попробую. все ясно, мой друг. но нет анимации
Честно говоря, я не совсем понимаю, чего вы хотите. Когда вы очищаете весь RecyclerView, анимировать больше нечего. По умолчанию анимация удаления скрывает удаленный элемент, а затем перемещает следующие элементы вверх, чтобы заполнить пустое пространство. Если список пуст, последующих элементов нет. Вы хотите быстро удалить каждый элемент по отдельности?
да, я хочу, чтобы при нажатии кнопки удаления каждый элемент удалял индивидуальную анимацию
count = adapter.getItemCount();
for (int i = 0 ; i < count; ++i){
notificationItems.remove(0);
}
adapterForNotification.notifyItemRangeRemoved(0, count-1)
Насколько я понимаю, вы можете удалять элементы, но вам нужно добавить некую анимацию при удалении; пожалуйста, посмотрите здесь
и напишу здесь еще раз, если кто-нибудь зайдет сюда
Он старый, но желаю, чтобы это помогло кому-то другому, поскольку на него еще не ответили; Я сделал это, удаляя по одному элементу за раз, моделируя анимацию смахивания по этому элементу, и публикуя задержку перед удалением следующего элемента, и так далее, вплоть до последнего элемента RecyclerView.
Шаг №1:
В вашем действии, содержащем кнопку «Очистить все» и экземпляр RecyclerView: Создайте метод удаления одного элемента.
private void deleteItem(View rowView, final int position) {
Animation anim = AnimationUtils.loadAnimation(requireContext(),
android.R.anim.slide_out_right);
anim.setDuration(300);
rowView.startAnimation(anim);
new Handler().postDelayed(new Runnable() {
public void run() {
if (myDataSource.size() == 0) {
addEmptyView(); // adding empty view instead of the RecyclerView
return;
}
myDataSource.remove(position); //Remove the current content from the array
myRVAdapter.notifyDataSetChanged(); //Refresh list
}
}, anim.getDuration());
}
Шаг №2:
Создайте метод, который удалит все элементы списка RecyclerView >> вызовите его в обратном вызове при нажатии кнопки.
boolean mStopHandler = false;
private void deleteAllItems() {
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (myDataSource.size() == 0) {
mStopHandler = true;
}
if (!mStopHandler) {
View v = myRecyclerView.findViewHolderForAdapterPosition(0).itemView;
deleteItem(v, 0);
} else {
handler.removeCallbacksAndMessages(null);
}
handler.postDelayed(this, 250);
}
};
requireActivity().runOnUiThread(runnable);
}
Также важно обрабатывать изменение конфигурации в манифесте, разделе активности, как если бы конфигурация изменилась при очистке вашего списка представлений ресайклера, возникнет исключение.
<activity
android:name = ".activities.MainActivity"
android:configChanges = "orientation|screenSize|keyboard"
android:label = "@string/app_name"
...
</activity>

Я сделал это, получив доступ к представлениям элементов списка непосредственно из адаптера recyclerview, затем анимации и уведомив адаптер после воспроизведения последней анимации.
fun deleteMultipleAnimated(){
val oldSize = myList.size
myList.removeAt(3)
myList.removeAt(4)
val newSize = myList.size
for(i in newSize until oldSize){
val listItemView = myRecycler.findViewHolderForAdapterPosition(i) as MyAdapater.MyViewHolder
if (i == oldSize-1){
//only the last animation notifies the adapter
listItemView.myView.animate().scaleX(0f).setDuration(250).withEndAction{
myAdapter.notifyItemRangeRemoved(newSize, oldSize)}
}else{
//every other view is animated without an end action
listItemView.myView.animate().scaleX(0f).duration = 250
}
}
}
Я читал, когда исчезает анимация notifyDataSetChanged. и я применяю это, также исчезновение анимации. Что я могу для этого сделать?