Android - размещение слушателей в адаптере

1

У меня есть несколько списков ListView, управляемых пользовательскими адаптерами (ArrayAdapter и CursorAdapter). В функциях getView() и bindView() адаптеров я создаю строку в ListView и устанавливаю Listener для конкретного элемента пользовательского интерфейса в строке.

В настоящее время, когда строки ListView отправляются в Recycler, слушатель все еще подключен, поэтому память никогда не выпускается. Я не вижу обратного вызова, когда строка удаляется, что даст мне возможность отключить слушателя до того, как строка будет переработана.

Как управлять слушателем в строках ListView? У меня есть только getView()/bindView(), чтобы добавить слушателя в строку, но ничего не удалять.

благодаря

Теги:
listview

2 ответа

0
Лучший ответ

После некоторых игр я решил использовать шаблон ViewHolder, и в этом я имею переменную, которая отслеживает слушателя. Когда предоставляется переработанное представление (где это применимо), я вытаскиваю слушателя (он все еще существует) и не забудьте зарегистрировать его как слушателя, прежде чем создавать нового слушателя и регистрировать его на своем месте. Это, вероятно, не поймает КАЖДОГО слушателя, но я в порядке с несколькими строками ListView, застрявшими в памяти.

0

Android OS выполняет ListView строк в ListView для вас. Представления генерируются "на лету", когда пользователь прокручивает список и уничтожается, когда они выходят из поля зрения. ОС Android разрушает представления, когда другому приложению требуется больше памяти, а некоторые из ваших объектов не используются, сортировка коллекции мусора.

И что касается вашего вопроса об удалении listeners, они автоматически удаляются, поскольку объект, на который они указывают, больше не существует, и они также помечены как объекты мусора.

  • 1
    Спасибо за ваш ответ. Вторичная переработка хороша, но это отличается от ее утилизации. Как Android сможет избавиться от объекта при наличии внешней ссылки на него (слушателя)? Я имею в виду, разве это не определение утечки памяти?
  • 0
    Хитрость в том, что системный корень должен иметь указатель на него. Когда вы создаете слушателя и присоединяете его к представлению, единственным элементом с указателем на слушателя является представление. Приложение через действие, через главное представление, через представление рециркуляции, через адаптер рециркуляции, через макет, через элемент макета имеет указатель на прослушиватель. Когда представление повторного просмотра, адаптер повторного использования или исходное представление удалено, слушатель больше не имеет связи с корнем - таким образом он получает сборщик мусора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню