Comments 23
Отличный макаронный код в ядре, а 64мс — прекрасная цифра! Порой бывает думаешь что в крупных компаниях код пишут как-то иначе, даже при приближении дедлайна.
Исходный код Android OS вообще часто радует глаз. Посмотрите, советую. Особенно наследников класса
View
.в некоторых версиях android она 128)
в 4.4 его начали рефакторить)
Зачем создавать новый адаптер каждый раз при обновлении данных?
Из-за реализации адаптера секций другого пути не было
А причем тут реализация секций? С ними работаю через getViewType в getView и выводят нужный шаблон.
Или просто github.com/emilsjolander/StickyListHeaders
Или просто github.com/emilsjolander/StickyListHeaders
1. Перед тем как обновлять адаптер необходимо вызвать метод
adapterMain.notifyDataSetInvalidated();
2. После окончания работы с адаптером:
adapterMain.notifyDataSetChanged();
3. Прочитайте про viewHolder pattern, да и вобще, ваш код адаптера — ужасен. См. пункт 5
4. Цифра 64мс не случайна. Именно за этот временной интервал должны быть выполнены изменения выполняемые в UI потоке. В противном случае у пользователя создастся ощущение лага. Я не первый раз слышу эту цифру от Гугла.
5. Посмотрите как нужно правильно делать адаптер с секциями, например тут: github.com/recoilme/freemp/blob/master/src/ru/recoilme/freeamp/player/AdpPlayer.java
6. У гугла куча косяков, но в данном конкретном случае — косячите Вы.
adapterMain.notifyDataSetInvalidated();
2. После окончания работы с адаптером:
adapterMain.notifyDataSetChanged();
3. Прочитайте про viewHolder pattern, да и вобще, ваш код адаптера — ужасен. См. пункт 5
4. Цифра 64мс не случайна. Именно за этот временной интервал должны быть выполнены изменения выполняемые в UI потоке. В противном случае у пользователя создастся ощущение лага. Я не первый раз слышу эту цифру от Гугла.
5. Посмотрите как нужно правильно делать адаптер с секциями, например тут: github.com/recoilme/freemp/blob/master/src/ru/recoilme/freeamp/player/AdpPlayer.java
6. У гугла куча косяков, но в данном конкретном случае — косячите Вы.
Цифра 64мс не случайна. Именно за этот временной интервал должны быть выполнены изменения выполняемые в UI потоке.
В данном случае это не о том. Чтобы не было лага надо уложиться в 16мс (60fps). Тут это задержка между тачем и перекраской итема в pressed-state. Чтобы при скроле не было морганий итема в прессед и обратно.
Согласен. Но все таки 16 мс это совсем жесткач, для приложений требования менее строги: developer.android.com/training/articles/perf-anr.html, последний абзац.
16мс это про плавные анимации. Первый абзац.
http://developer.android.com/training/custom-views/optimizing-view.html
http://developer.android.com/training/custom-views/optimizing-view.html
Код адаптера не мой, просто как-то нашел его в исходниках чужого проекта, он там нормально работал и я решил перетащить его себе
1. Мы не обновляем адаптер — мы устанавливаем новый адаптер, соответственно notifyDataSetChanged вызывать не у кого.
3. В этом адаптере ViewHolder не нужен, т.к. он не инфлейтит вьюшки
3. В этом адаптере ViewHolder не нужен, т.к. он не инфлейтит вьюшки
6. Это ошибка гугла т.к. список должен корректно менять свои адаптеры раз такая возможность есть
По хорошему, такой возможности нет. Метод
setAdapter
у ListView
ставить адаптер, а не меняет его. Нету метода replaceAdapter
или swapAdapter
. Адаптер на то и адаптер, что его надо поставить, а потом просто данные ему скармливать, и он будет ими манипулировать.зачем методы replaceAdapter/swapAdapter? Например, класс TextView обходится одним методом setText и он не только устанавливает текст в первый раз, но и меняет в последующие
Верно, но
Если ваш адаптер работает таким образом, что его необходимо постоянно пересоздавать, то советую взглянуть на другие альтернативы. Например, как писали выше, StickyListHeaders. Пользовался им, отлично написано и работает правильно.
TextView
-то виджет, а адаптер нет. Это из семантики вещей происходит. Для того, чтобы манипулировать данными в адаптере есть специальные методы, такие как add, addAll, remove, clear
и т.д в то время как адаптер должен быть одним. Это просто логично:) Если ваш адаптер работает таким образом, что его необходимо постоянно пересоздавать, то советую взглянуть на другие альтернативы. Например, как писали выше, StickyListHeaders. Пользовался им, отлично написано и работает правильно.
Если вы кликнули на ячейку, а в этот момент загрузились новые данные с сервера и установились в список, значит вы кликнули по новым данным…
Всегда проверяйте результат метода ...
Но самой по себе такой проверки не достаточно. Ведь если новые данные в той же ячейке кликабельны, то пользователь получит не то, на то что кликал — тоже плохо. То есть обязательно надо что-то еще — например, как и написано, устанавливать mDataChanged. Я бы в такой ситуации просто ставил Enabled=false на время загрузки новых данных — чтобы пользователь даже не видел анимацию при нажатии и не удивлялся, что ничего не произошло.
Sign up to leave a comment.
64 миллисекунды после нажатия