Как анимировать добавление или удаление строк Android ListView - PullRequest
209 голосов
/ 14 октября 2010

В iOS есть очень простое и мощное средство для анимации добавления и удаления строк UITableView, вот клип из видео на YouTube , показывающий анимацию по умолчанию. Обратите внимание, как окружающие строки сворачиваются в удаленную строку. Эта анимация помогает пользователям отслеживать, что изменилось в списке и где они находились в списке при изменении данных.

Поскольку я разрабатывал для Android, я не нашел эквивалентного средства для анимации отдельных строк в TableView . Вызов notifyDataSetChanged() на моем адаптере приводит к тому, что ListView немедленно обновляет свое содержимое новой информацией. Я хотел бы показать простую анимацию новой строки, которая сдвигается или сдвигается при изменении данных, но я не могу найти никакого документированного способа сделать это. Похоже, что LayoutAnimationController может содержать ключ к тому, чтобы заставить это работать, но когда я устанавливаю LayoutAnimationController в моем ListView (аналогично LayoutAnimation2 в ApiDemo) и удаляю элементы из моего адаптера после списка элементы исчезают сразу, вместо того, чтобы их оживить.

Я также пробовал что-то вроде следующего, чтобы оживить отдельный элемент при его удалении:

@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
    Animation animation = new ScaleAnimation(1, 1, 1, 0);
    animation.setDuration(100);
    getListView().getChildAt(position).startAnimation(animation);
    l.postDelayed(new Runnable() {
        public void run() {
            mStringList.remove(position);
            mAdapter.notifyDataSetChanged();
        }
    }, 100);
}

Однако строки, окружающие анимированный ряд, не перемещаются, пока не перейдут на свои новые позиции при вызове notifyDataSetChanged(). Похоже, ListView не обновляет свой макет после размещения его элементов.

Хотя написание моей собственной реализации / форка ListView приходило мне в голову, это кажется чем-то, что не должно быть таким сложным.

Спасибо!

Ответы [ 14 ]

1 голос
/ 19 июня 2011

Я не пробовал, но похоже, что animateLayoutChanges должен делать то, что вы ищете. Я вижу это в классе ImageSwitcher, я предполагаю, что это также и в классе ViewSwitcher?

1 голос
/ 17 октября 2010

Поскольку Android является открытым исходным кодом, вам на самом деле не нужно переопределять оптимизации ListView. Вы можете взять код ListView и попытаться найти способ взломать анимацию, вы также можете открыть запрос функции в трекере ошибок Android (и если вы решили его реализовать, не забудьте внести патч ).

К вашему сведению, исходный код ListView здесь .

0 голосов
/ 10 августа 2016

Просто делюсь другим подходом:

Сначала установите список android: animateLayoutChanges в true :

<ListView
        android:id="@+id/items_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"/>

Затем я использую обработчик для добавления элементов и обновления списка с задержкой:

Handler mHandler = new Handler();
    //delay in milliseconds
    private int mInitialDelay = 1000;
    private final int DELAY_OFFSET = 1000;


public void addItem(final Integer item) {
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    mDataSet.add(item);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                }
            }).start();

        }
    }, mInitialDelay);
    mInitialDelay += DELAY_OFFSET;
}
0 голосов
/ 04 мая 2012

Я сделал что-то похожее на это.Один из подходов заключается в интерполяции во времени анимации высоты представления во времени внутри строк onMeasure при выдаче requestLayout() для listView.Да, может быть, лучше сделать это непосредственно внутри кода listView, но это было быстрое решение (это выглядело хорошо!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...