2013-11-29 3 views
0

Факты: У меня есть список из 6 элементов (строк), а последний элемент имеет строку «Дополнительные параметры».Развернуть список просмотров с анимацией (по нескольким пунктам - не весь список)

После нажатия на «дополнительные параметры», список должен добавить 3 элемента между пунктом5 и «дополнительные параметры» (последний элемент).

- item1 
- item2 
- item3 
- item4 
- item5 
- "more options" 

Проблема: Я использую notifyDataSetChanged(), чтобы уведомить адаптер, что новые элементы добавляются в список. Но каков наилучший способ для aimate расширение списка из 6 предметов на 9 предметов без воссоздания всего списка?

Окончательный вид списка (после помещения item6, item7, item8 с ОДНОЙ анимацией).

- item1 
- item2 
- item3 
- item4 
- item5 
- item6 (new) 
- item7 (new) 
- item8 (new) 
- "more options" 

Это плохая практика/Hacky положить боковик каждый элемент, необходимый и сделать item6, ст.7, ст.8 невидимым? Каков наилучший способ?

Надеюсь, мой вопрос хорошо написан, и все понимают мою боль.

Благодаря

+0

Может это помочь https://github.com/karnshah8890/tech_andy/tree/master/ListviewAnimationDemo –

ответ

1

вы должны создать анимационную что-то вроде этого

private void enlarge(final View v, AnimationListener al) 
{ 
    final int initialHeight = v.getMeasuredHeight(); 

    Animation anim = new Animation() { 
     @Override 
     protected void applyTransformation(float interpolatedTime, Transformation t) 
     { 
      if (interpolatedTime == 1) 
      { 
       v.setVisibility(View.GONE); 
      } 
      else 
      { 
       v.getLayoutParams().height = initialHeight + (int) (initialHeight * interpolatedTime); 
       v.requestLayout(); 
      } 
     } 

     @Override 
     public boolean willChangeBounds() 
     { 
      return true; 
     } 
    }; 

    if (al != null) 
    { 
     anim.setAnimationListener(al); 
    } 
    anim.setDuration(ANIMATION_DURATION); 
    v.startAnimation(anim); 
} 

затем использовать это при добавлении элементов в ListView до того, что создать AnimationListener

AnimationListener al = new AnimationListener() { 
     @Override 
     public void onAnimationEnd(Animation arg0) 
     { 
      mAnimList.remove(index); 

      ViewHolder vh = (ViewHolder) v.getTag(); 
      vh.needInflate = true; 

      mMyAnimListAdapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) 
     { 
     } 

     @Override 
     public void onAnimationStart(Animation animation) 
     { 
     } 
    }; 

и, наконец называют

enlarge(v, al); 
+0

Вы увеличиваете здесь каждый элемент для себя? – iFoukis

+0

Да, этот код будет делать для каждого элемента, если вы хотите продлить его только после того, как вам нужно найти длину, необходимую для добавления элементов, а затем вызвать это с помощью последнего элемента перед «дополнительными параметрами». – keshav