Как очистить представления, которые хранятся в ListView RecycleBin?

В виджетах ListView ListView будут сохранены представления, полученные из метода getView адаптера во внутреннем классе RecycleBin.

Как очистить представления в RecycleBin и заставить ListView воссоздать все дочерние представления.

Ответ 1

Если я правильно помню, вызов invalidate на виджет ListView будет очищать кеш Views, который в настоящее время хранится. Я бы посоветовал не опустошать кеш просмотров ListView из-за потенциальных проблем с производительностью.

Если вы не собираетесь использовать элемент convertView, тогда вам будет нужно каждый раз создавать представление строки (в результате получается много объектов, созданных каждый раз, когда пользователь прокручивает) + дополнительная занимаемая память по переработанным представлениям из RecycleBin, которые никогда не будут использоваться в любом случае.

Ответ 2

Вызов invalidate() или invalidateViews() не помогло (как указано в правильном ответе). Переработанные виды сохранялись в ListView. Мне нужно было найти исходный код Android, чтобы найти решение. Я проверил множество методов, в том числе метод setAdapter() класса ListView (API Android 15):

@Override
public void setAdapter(ListAdapter adapter) {

    // ...
    mRecycler.clear();
    // ...

}

Как вы заметили, установка адаптера очищает переработчик, который содержит все переработанные виды в виде списка. Вам не нужно создавать новый адаптер, достаточно установить один и тот же адаптер, чтобы очистить список переработанных просмотров в представлении списка:

Adapter adapter = listview.getAdapter ();
// ... Modify adapter ... do anything else you need to do
// To clear the recycled views list :
listview.setAdapter ( adapter );

Ответ 3

В ListView - reclaimViews(List<View>) есть специальный метод. Он перемещает все элементы, которые в настоящее время используются и в корзине, в указанный список. Widget будет запрашивать новые представления для элементов из Adapter перед рендерингом в следующий раз.

Вы можете использовать восстановленные представления, если изменений в структуре элементов не так много или полностью их обрывать. Например, я использую этот метод для динамического обновления фона для элементов, когда пользовательский цвет выбора был изменен.

Ответ 4

Удалите объект корзины из ArrayList или структуру данных, которую вы использовали в своем пользовательском адаптере, а также вызовите метод notifyDataSetChanged вашего адаптера.