Android: определить, приостановлена ​​ли родительская активность View

В одном из моих действий у меня есть ListView, который отображает список местоположений. Для каждого элемента списка мне нужен маленький значок стрелки, указывающий направление соответствующего местоположения. Я реализовал этот значок, расширив ImageView. В этом пользовательском представлении есть прослушиватель, который реагирует на изменения ориентации устройства, соответствующим образом поворачивая изображение значка. Я регистрирую прослушиватель в методе onAttachedToWindow() и отменяю его регистрацию в onDetachedFromWindow(). Этот вид работает, но проблема в том, что onDetachedFromWindow() иногда вызывается только спустя долгое время после того, как содержащее действие было приостановлено. Кроме того, весь макет в целом кажется немного хакерским. Итак, мой вопрос: есть ли правильный способ отменить регистрацию слушателей или вы бы для начала реализовали это совершенно другим способом?


person Steven Meliopoulos    schedule 20.06.2010    source источник


Ответы (1)


Я думаю, у вас проблемы, потому что ваш дизайн хакерский, как вы признаете. Я думаю, что вам, вероятно, следует сделать так, чтобы ваша активность прослушивала ориентацию устройства и использовала onPause/onResume для обработки регистрации изменений ориентации. Затем создайте собственный курсор, который обновляется действием при его изменении. Затем пользовательский курсор может вызвать notifyDataSetChanged, чтобы сообщить ListView об обновлении. Затем в вызове getView вы можете передать данные, необходимые для правильного отображения вашей стрелки. Таким образом, будут обновлены только те стрелки, которые видны. У вас будет только одно место, где вы получаете данные об ориентации, а позже вы сможете обработать onScrollStateChanged и перестать обновлять стрелки, когда пользователь прокручивает, если это слишком сильно влияет на анимацию прокрутки.

person Rich Schuler    schedule 20.06.2010
comment
Большое спасибо! Прислушиваться к ориентации в Activity действительно кажется правильным, так как нет необходимости делать это более чем в одном месте, и Activity также является единственным местом, где я могу использовать onPause и onStart. Однако я начал реализовывать его таким образом и обнаружил новую проблему: вызов notifyDataSetChanged с такой высокой частотой еще больше снижает производительность, потому что getView также будет обновлять все остальное об элементах списка. Должен быть способ убедиться, что эти обновления затрагивают только значки. Что мне теперь делать? - person Steven Meliopoulos; 22.06.2010