Получить кэшированные представления из ListAdapter - PullRequest
0 голосов
/ 24 января 2012

Когда список отображается и прокручивается, ListAdapter.getView () либо создает новое представление элемента списка, либо переоснащает существующее представление, переданное ему (как "convertView), для отображения нового содержимого.

Мне интересно, есть ли способ получить все представления, созданные getView ()? Например. если представления элемента списка должны освободить какой-либо ресурс при разрушении действия, было бы хорошо просмотреть все представления элемента списка и сказать им освободить ресурс.

Ответы [ 4 ]

4 голосов
/ 24 января 2012

Ну, это не так же просто, как перебирать ListView с использованием ListView#getChildAt(int) - ListView является подклассом AbsListView - и AbsListView реализуетRecycleBin используется для хранения View s, которые будут использоваться повторно.

До того, как View будет помещен в RecycleBin, он отсоединяется от своего родителя (представление списка) с помощью ViewGroup#detachViewFromParent(View), таким образом рендерингон недоступен при использовании getChildAt(int).

. Вам необходимо реализовать интерфейс RecyclerListener, который будет уведомлять вас о перемещении View в RecycleBin.

.
0 голосов
/ 24 января 2012

Если ваш адаптер не используется вне этой Деятельности (в таком случае вы действительно не знаете, что вам больше не нужны эти представления, верно?), Ваша единственная ссылка (и) на этот адаптер находится внутри Деятельности.Это означает, что если ваша активность будет собирать мусор, то ваш адаптер будет собирать мусор, а это значит, что ваши представления будут собираться.Я бы не стал пытаться оптимизировать это, если у вас нет измеримых проблем с этим поведением.

0 голосов
/ 24 января 2012

Это Java. Вы не можете приказать приложению или экземпляру быть действительно уничтоженным, чтобы освободить ресурсы. С помощью finalize () вы можете только повысить вероятность того, что java-машина сделает это.

0 голосов
/ 24 января 2012

Поскольку ListView является ViewGroup, вы должны иметь возможность выполнять итерации для дочерних представлений следующим образом:

for (int i=0; i < myListView.getChildCount(); i++) {
    View v = myListView.getChildAt(i);

    //Check to see if this view has the resource, then release it
}

В этом вопросе необходимо нечто подобное: Android: доступ к дочерним представлениямиз ListView

...