Intereting Posts
Android: отключите ленивую загрузку списка Интеграция эспрессо с Proguard и Gradle Синхронизация репо завершается с ошибкой: индекс-пакет скончался от сигнала 9 " Почему view.onLayout () вызывается повторно при изменении = false? Синхронизировать таблицу базы данных SQLite / Android с удаленной базой данных MySQL (через PHP) Есть ли библиотека или алгоритм для преобразования Shamsi (Jalali) в григорианскую дату на Java? Как сохранить объект Date в SharedPreferences? Проверьте, настроена ли сеть ScanResult (существует в списке getConfiguredNetworks ()) Как я могу подавить анонимный новый runnable () можно заменить лямбдой Панель инструментов setNavigationOnClickListener разрывает функциональность ActionbarDrawerToggle Использование планировщика заданий в Android API <21 Android Studio: комбинация вкуса продукта с более чем двумя вкусовыми размерами (группы вкуса) Таймер в фоновом режиме Как создать проект Flutter с Android-файлом Android? Есть ли «добавление к домашнему экрану» webapp на Android (как в iOS)

Как использовать ItemAnimator в RecyclerView?

Я хочу сделать анимацию, когда элемент добавлен или удален из адаптера recyclerview. Я пытаюсь использовать RecyclerView.ItemAnimator следующим образом, но он не работает.

public class MyAnimator extends RecyclerView.ItemAnimator{ @Override public boolean animateAdd(ViewHolder arg0) { Log.d("test","Added Animation"); return false; } @Override public boolean animateChange(ViewHolder arg0, ViewHolder arg1, int arg2, int arg3, int arg4, int arg5) { Log.d("test","Change Animation"); return false; } @Override public boolean animateMove(ViewHolder arg0, int arg1, int arg2, int arg3, int arg4) { // TODO Auto-generated method stub return false; } @Override public boolean animateRemove(ViewHolder arg0) { Log.d("test", "Remove Animation"); return false; } @Override public void endAnimation(ViewHolder arg0) { // TODO Auto-generated method stub } @Override public void endAnimations() { // TODO Auto-generated method stub } @Override public boolean isRunning() { // TODO Auto-generated method stub return false; } @Override public void runPendingAnimations() { // TODO Auto-generated method stub } } 

Я использую следующий код следующим образом.

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); data=new ArrayList<String>(); // use a linear layout manager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); animator = new MyAnimator(); mRecyclerView.setItemAnimator(animator); mAdapter = new MyAdapter(data); mRecyclerView.setAdapter(mAdapter); } 

Всякий раз, когда я добавляю новый элемент в набор данных и вызываю mAdapter.notifyDataSetChanged() я ожидал, что Log присутствует в animateAdd(ViewHolder arg0) присутствующем в классе MyAnimator; Но это не придет. Я что-то пропустил. Почему он не работает.

Прежде всего, для этого вам не нужен специальный ItemAnimator. Вы можете использовать по умолчанию один, удалить mRecyclerView.setItemAnimator(animator);

Кроме того, вы должны использовать notifyItemInserted() и notifyItemRemoved() вместо notifyDataSetChanged() , он вызывает соответствующую анимацию для вас.