Как анимировать элемент в ListView при нажатии?

Я хочу иметь один ListView, который, когда я нажимаю на элемент, выдвигается влево.

Так что я:

listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            arg1.startAnimation(openAnimation);
        }
    });

Однако анимация применялась к другому элементу в списке, а не к тому, по которому щелкнули. Поведение кажется случайным, поскольку иногда это происходило с более чем одним элементом одновременно.

Как я и подозревал, это связано с тем, что адаптер повторно использует представление для создания элемента. Я решил изменить метод getView в своем адаптере, чтобы каждый раз при его вызове раздувалось новое представление. Тогда анимация больше не происходит.

Есть ли способ решить эту проблему? Я попытался переместить анимацию внутрь моего адаптера, но тогда я не могу связать ее с другим действием в списке.

В конечном счете, я хочу, чтобы элемент был интерактивным, но при пролистывании влево/вправо открывалась кнопка удаления (поведение iOS при удалении). Я на неправильном пути здесь? Это должно быть возможно, поскольку Android может реализовать смахивание для удаления в панели уведомлений.


person RobGThai    schedule 04.04.2012    source источник
comment
iOS удаляет поведение НЕТ НЕТ НЕТ НЕТ! Андроид НЕ iOS! Пожалуйста, не используйте шаблоны дизайна iOS. Пользователи Android ожидают, что Android User Experience НЕ будет работать с iPhone.   -  person slayton    schedule 04.04.2012
comment
Я понимаю вашу озабоченность. Я сам категорически против этой идеи. Но я не тот, кто принимает решения здесь. Но вы должны признать, что свайп для удаления есть и на Android. Реализация есть, просто подача другая.   -  person RobGThai    schedule 04.04.2012
comment
Панель уведомлений, вероятно, имеет пользовательскую реализацию списка, поскольку базовый класс списка не поддерживает это поведение смахивания для удаления.   -  person slayton    schedule 04.04.2012


Ответы (1)


Я рекомендую вам также проверить эту тему .

Я не думаю, что это возможно без модификации вашего адаптера, чтобы он соответствовал такому типу поведения. Насколько я понимаю, у вас нет проблем с реализацией кода, распознающего жесты смахивания в разных строках ListView, только с анимацией, которая должна следовать этому жесту в соответствующих строках.

Я бы переписал адаптер, чтобы он соответствовал как минимум двум типам строк: обычным строкам и строкам, которые нужно удалить. В методе "getView()" вашего адаптера вы должны повторно использовать только convertView обычных представлений. Строки, которые должны быть удалены, не должны использоваться повторно, чтобы анимация одной не повлияла на другие. Щелкнув обычную строку, вы должны сначала сообщить адаптеру, что строка в позиции, в которой щелкнули, теперь относится к типу, подлежащему удалению, вызвать .notifyDatasetChanged(), а затем запустить анимацию для этой строки.

person Zsombor Erdődy-Nagy    schedule 31.05.2012
comment
Как запустить анимацию только в этой строке? Я View v = inflater.inflate(R.layout.list_view_custom, null); а затем в прослушивателе у меня есть окончательная анимация анимации = AnimationUtils.loadAnimation(parent.getContext(), R.anim.fade_in_expand); v.startAnimation (анимация); Но ничего не происходит. - person MinceMan; 25.11.2012