Анимировать вновь добавленные элементы в ListView

#android #listview #animation #adapter

#Android #listview #Анимация #адаптер

Вопрос:

Как я могу анимировать вновь добавленные элементы в ListView ?

У меня есть adapter и когда я добавляю новые элементы в свой список, я говорю, что adapter.notifyDataSetChanged(); элементы добавлены, все работает отлично, но моя проблема в том, что я хочу, чтобы у вновь добавленного элемента была какая-то анимация.

Комментарии:

1. У меня такое чувство, что это непростая задача. Сколько элементов вы планируете иметь в вашем ListView ?

2. Ну, я хочу, чтобы анимация воспроизводилась каждый раз, когда добавляется новый элемент. Есть что-то, что случайным образом изменяет мои данные и adapter.notifyDataSetChanged(); я вызывал каждую секунду, поэтому, если есть новые данные, чем они представлены в listview, это работает идеально, но проблема в том, что нет анимации . . .

3. Причина, по которой я спросил о количестве элементов, заключается в том, что у вас будет больше шансов анимировать свои дополнения к LinearLayout . Но это возможно только в том случае, если у вас довольно ограниченное количество просмотров. Если вы планируете иметь, скажем, более 50 элементов в списке, то LinearLayout это становится слишком дорогим.

4. хорошо иметь анимированное Linearlayout, если это возможно, я имею в виду линейную компоновку внутри listview в качестве элемента. Вы знаете, как я могу это сделать?

5.Нет, я имел в виду LinearLayout вместо ListView .

Ответ №1:

Animate каждый добавленный элемент в getView() методе вашего Custom Adapter .

 public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.simple_list_item_1, null);
    }

    ListData o = list.get(position);
    TextView tt = (TextView) v.findViewById(R.id.toptext);

    tt.setText(o.content);

    Log.d("ListTest", "Position : " position);
    if(flag == false) {
        Animation animation = AnimationUtils
                .loadAnimation(getActivity(), R.anim.slide_top_to_bottom);
        v.startAnimation(animation);
    }
    return v;
}
  

И тем самым добиться Animation .

Комментарии:

1. вы пробовали это?, как насчет BindView, должен ли я переопределить этот метод тоже?

2. да, я пробовал это, и у меня это работает. я не думаю, что вам нужно переопределять метод BindView.

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

4. @ASH Что это за флаговая переменная в строке «if(флаг == false)»?

5. @NiteshKhatri это используется, чтобы избежать анимации ячеек, которые в данный момент отображаются

Ответ №2:

В официальных документах об анимации в Android говорится, что вы можете настроить анимацию для запуска при изменении макета, используя android:animateLayoutChanges=»true».

Взято из:http://developer.android.com/training/animation/layout.html

Комментарии:

1. Этот пример не является обычным представлением списка, это вид прокрутки.

Ответ №3:

Добавить такого рода анимации сложнее, чем я думал вначале. Есть два способа, в зависимости от вида анимации, которого вы пытаетесь достичь.

Это довольно сложный способ, но единственный способ, который я нашел, чтобы добавить анимацию к ListView дочерним элементам, заключается в следующем:

Вы можете попробовать уведомить адаптер об идентификаторе элемента, который вы хотите удалить, и вызвать adapter.notifyDataSetChanged(); . Это приведет к вызовам getView() метода адаптера. Внутри него вы можете сделать что-то вроде:

 if ( item.getId() == itemToRemove ) {
 //apply the animation
}
  

После завершения анимации вы можете вспомнить, adapter.notifyDataSetChanged() чтобы расставить все по местам.