Pull to refresh

Comments 23

Отличный макаронный код в ядре, а 64мс — прекрасная цифра! Порой бывает думаешь что в крупных компаниях код пишут как-то иначе, даже при приближении дедлайна.
Исходный код Android OS вообще часто радует глаз. Посмотрите, советую. Особенно наследников класса View.
А я больше люблю сам класс View. Еще ни разу до конца не дочитал )
А вообще, качество кода местами удручает и читается плохо. Но он по крайне мере есть и можно в него залезть и увидеть, что там происходит и как это обойти.
Зачем создавать новый адаптер каждый раз при обновлении данных?
Из-за реализации адаптера секций другого пути не было
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. У гугла куча косяков, но в данном конкретном случае — косячите Вы.
Цифра 64мс не случайна. Именно за этот временной интервал должны быть выполнены изменения выполняемые в UI потоке.

В данном случае это не о том. Чтобы не было лага надо уложиться в 16мс (60fps). Тут это задержка между тачем и перекраской итема в pressed-state. Чтобы при скроле не было морганий итема в прессед и обратно.
Чуть чуть поправлю, ANR все же не появится при 100ms
// Default input dispatching timeout if there is no focused application or paused window
// from which to determine an appropriate dispatching timeout.
const nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec

Код адаптера не мой, просто как-то нашел его в исходниках чужого проекта, он там нормально работал и я решил перетащить его себе
минусуют ребята из Mail.ru которые не используют чужие библиотеки и по хардкору пишут весь код сами?
Использование чужих библиотек — это не то же самое, что и программирование методом копи-паста.
1. Мы не обновляем адаптер — мы устанавливаем новый адаптер, соответственно notifyDataSetChanged вызывать не у кого.
3. В этом адаптере ViewHolder не нужен, т.к. он не инфлейтит вьюшки
6. Это ошибка гугла т.к. список должен корректно менять свои адаптеры раз такая возможность есть
По хорошему, такой возможности нет. Метод setAdapter у ListView ставить адаптер, а не меняет его. Нету метода replaceAdapter или swapAdapter. Адаптер на то и адаптер, что его надо поставить, а потом просто данные ему скармливать, и он будет ими манипулировать.
зачем методы replaceAdapter/swapAdapter? Например, класс TextView обходится одним методом setText и он не только устанавливает текст в первый раз, но и меняет в последующие
Верно, но TextView-то виджет, а адаптер нет. Это из семантики вещей происходит. Для того, чтобы манипулировать данными в адаптере есть специальные методы, такие как add, addAll, remove, clear и т.д в то время как адаптер должен быть одним. Это просто логично:)

Если ваш адаптер работает таким образом, что его необходимо постоянно пересоздавать, то советую взглянуть на другие альтернативы. Например, как писали выше, StickyListHeaders. Пользовался им, отлично написано и работает правильно.
Если вы кликнули на ячейку, а в этот момент загрузились новые данные с сервера и установились в список, значит вы кликнули по новым данным…
Всегда проверяйте результат метода ...

Но самой по себе такой проверки не достаточно. Ведь если новые данные в той же ячейке кликабельны, то пользователь получит не то, на то что кликал — тоже плохо. То есть обязательно надо что-то еще — например, как и написано, устанавливать mDataChanged. Я бы в такой ситуации просто ставил Enabled=false на время загрузки новых данных — чтобы пользователь даже не видел анимацию при нажатии и не удивлялся, что ничего не произошло.
Sign up to leave a comment.

Articles