#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:
Добавить такого рода анимации сложнее, чем я думал вначале. Есть два способа, в зависимости от вида анимации, которого вы пытаетесь достичь.
-
С помощью LayoutAnimationController. В демонстрационных версиях API есть пример.
-
Анимация каждого
View
:
Это довольно сложный способ, но единственный способ, который я нашел, чтобы добавить анимацию к ListView
дочерним элементам, заключается в следующем:
Вы можете попробовать уведомить адаптер об идентификаторе элемента, который вы хотите удалить, и вызвать adapter.notifyDataSetChanged();
. Это приведет к вызовам getView()
метода адаптера. Внутри него вы можете сделать что-то вроде:
if ( item.getId() == itemToRemove ) {
//apply the animation
}
После завершения анимации вы можете вспомнить, adapter.notifyDataSetChanged()
чтобы расставить все по местам.