Как добавить элементы recyclerview удалить анимацию

Когда я использую это, он удаляет один элемент с анимацией

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

person Elsen Almasli    schedule 08.11.2018    source источник


Ответы (3)


Насколько я понимаю, вы можете удалять элементы, но вам нужно добавить некую анимацию при удалении; пожалуйста, посмотрите здесь

и напишу здесь еще раз, если кто-нибудь зайдет сюда

Он старый, но желаю, чтобы это помогло кому-то другому, поскольку на него еще не ответили; Я сделал это, удаляя по одному элементу за раз, моделируя анимацию смахивания по этому элементу, и размещая задержку перед удалением следующего элемента, и так далее, вплоть до последнего элемента 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>

person Zain    schedule 25.01.2019

Вы не должны использовать одновременно 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);
}
person TheWanderer    schedule 08.11.2018
comment
Я читал, когда исчезает анимация notifyDataSetChanged. и я применяю это, также исчезновение анимации. Что я могу для этого сделать? - person Elsen Almasli; 08.11.2018
comment
Попробуйте с notifyItemRangeRemoved(0, notificationItems.size() - 1). - person TheWanderer; 08.11.2018
comment
Заявка прекращена - person Elsen Almasli; 08.11.2018
comment
Поделитесь трассировкой стека. - person TheWanderer; 08.11.2018
comment
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.support.cyv7.widget. Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:5817) - person Elsen Almasli; 08.11.2018
comment
Я попробую. все ясно, мой друг. но нет анимации - person Elsen Almasli; 08.11.2018
comment
Честно говоря, я не совсем понимаю, чего вы хотите. Когда вы очищаете весь RecyclerView, анимировать больше нечего. По умолчанию анимация удаления скрывает удаленный элемент, а затем перемещает следующие элементы вверх, чтобы заполнить пустое пространство. Если список пуст, последующих элементов нет. Вы хотите быстро удалить каждый элемент по отдельности? - person TheWanderer; 08.11.2018
comment
да, я хочу, чтобы при нажатии кнопки удаления каждый элемент удалял индивидуальную анимацию - person Elsen Almasli; 08.11.2018

Я сделал это путем доступа к представлениям элементов списка непосредственно из адаптера 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
        }
    }
}    
person J7bits    schedule 16.08.2020