2013-12-09 4 views
0

У меня есть активность с несколькими страницами, каждая из которых содержит ListView. Я использую адаптер для настраиваемых элементов списка. Каждый элемент анимируется в списке:Анимация элементов списка с анимацией

public View getView(int i, View view, ViewGroup viewGroup) { 
    if (view == null) { 
     v = inflater.inflate(R.layout.list_item, null); 
     doTheThing = true; 
    } 

    //Some random code here 

    if(doTheThing) { 
     Animation animation = AnimationUtils.loadAnimation(a, R.anim.list_item_animation); 
     animation.setStartOffset(i * 60 + 200); 
     v.startAnimation(animation); 
    } 

    return v; 
} 

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

Как я могу это исправить?

ответ

1

Основание «doTheThing» вне зависимости от того, является ли преобразование null равным нулю, не будет полностью детерминированным.

Адаптер не гарантирует, когда/когда он собирается перерабатывать представления, и когда он будет предоставлять вам новые.

Конечно, вы гарантированно получите новые виды для оценки стоимости первой страницы в представлении списка. Тем не менее, адаптер может решить, что ему вдруг нужно 4 представления вместо 3, чтобы поддерживать плавную прокрутку, и в этом случае вы получите view == null и запускаете анимацию.

Я рекомендую полагаться на более детерминированный способ определения того, какие виды ожидают. Например, все представления, которые извлекаются в течение 500 мс первого просматриваемого вида, будут анимированы и т. Д.

+1

Спасибо за идею, я попробовал ее, установив переменную 'static long' в действие, которое содержит ListViews с' (new Date()). getTime() ', а затем проверяя эту переменную в ListAdapter, сравнивая ее с текущим временем. Если различие больше 1000 (это нормально для того, что мне нужно), анимация не выполняется. В Activity, который содержит все, я также использовал putLong() и getLong(), чтобы перенести время начала, если активность перезапущена (например, при изменении ориентации экрана. – Squeazer

+0

Не имеет отношения к этому вопросу в некотором смысле ... но вы должны избегайте создания объектов, которые вам не нужны (новая дата() ...). System.currentTimeMillis() выполнит то же самое. –

Смежные вопросы