#android #android-listview #smooth-scrolling
#Android #android-listview #плавная прокрутка
Вопрос:
У меня есть Android ListView
, который имеет небольшие (скажем, 1-5 кадров) заикания при прокрутке, примерно каждую секунду или около того. Я понимаю, что у многих телефонов Android есть эти проблемы с плавностью анимации, однако на моем телефоне (Motorola A855 под управлением Android 2.2) собственный список контактов прокручивается довольно плавно. Просмотр элементов в списке контактов более сложный, чем просмотр элементов в моем списке, который:
<RelativeLayout>
<TextView />
<TextView />
</RelativeLayout>
Я только хочу добиться такой же плавности, как в собственном списке контактов. Кажется, что это должно быть возможно без оптимизации в машинном коде, но, возможно, я ошибаюсь в этом.
Я попробовал несколько вещей: я еще больше упростил представление элемента и попробовал создать его программный экземпляр вместо XML. Я также попытался изменить способ, которым я реагирую на события щелчка элемента, согласно этой ссылке:
http://groups.google.com/group/android-developers/browse_thread/thread/7dc261a6b382ea74?pli=1
Похоже, ни одна из этих вещей не оказывает никакого влияния на производительность.
Могу ли я что-нибудь сделать в своем приложении для повышения производительности? Я собираюсь развернуть это приложение на нескольких телефонах, поэтому изменение настроек на телефоне или рутирование устройства в моем случае не вариант. Вот метод getView из моего класса adapter:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater flater = (LayoutInflater)context.getSystemService(ListActivity.LAYOUT_INFLATER_SERVICE);
layout = flater.inflate(R.layout.song_view, parent, false);
TextView first = (TextView)layout.findViewById(R.id.firstLine);
TextView second = (TextView)layout.findViewById(R.id.secondLine);
Thing t = array.get(position);
first.setText(t.title);
second.setText(t.name);
return layout;
}
Заранее спасибо!
Комментарии:
1. предоставьте некоторую информацию о вашем адаптере
2. Предполагается, что вы * по крайней мере, прочитали официальное руководство по Android. Это называется шаблоном Viewholder.
Ответ №1:
Трудно понять, почему это может происходить, не видя ваш код.
Однако стоит обратить внимание на ваш метод getView() в вашем ListAdapter (при условии, что вы используете пользовательский адаптер). Попробуйте повторно использовать представление, переданное в качестве аргумента этому методу, вместо того, чтобы каждый раз создавать новое. Также не делайте ничего слишком сложного в этом методе (например, сетевой вызов), на самом деле постарайтесь сделать его как можно более экономичным для достижения наилучшей производительности.
Комментарии:
1. «Попробуйте повторно использовать представление, переданное в качестве аргумента этому методу, вместо того, чтобы каждый раз создавать новое». Это оказалось именно той проблемой. Я надеюсь, что это поможет другим людям, которые думают, что параметр convertView предназначен только для удобства. Я добавил свой оригинальный, неработающий код к вопросу, чтобы люди могли увидеть мою ошибку. Марк Эллисон, ты (странный, ужасный) компьютерный бог.
2. Что делать, если я использую
SimpleCursorAdapter
со вторым, не устаревшим конструктором? Должен ли я расширить его или он должен делать это из коробки?3. Он будет использовать автоматическую переработку просмотров. Если вы переопределите getView (), вам нужно будет обработать переработку представления.
Ответ №2:
Вы пробовали эффективный адаптер http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html
С моей точки зрения, проблема плавности анимации связана с тем, что сборщик мусора работает в фоновом режиме. Если вы создаете много объектов, то вы увидите задержку в прокрутке listview.
Надеюсь, это поможет.
Комментарии:
1. Исходная ссылка устарела, попробуйте эту: linuxtopia.org/online_books/android/devguide/guide/samples /…