В виджетах ListView ListView будут сохранены представления, полученные из метода getView адаптера во внутреннем классе RecycleBin.
Как очистить представления в RecycleBin и заставить ListView воссоздать все дочерние представления.
В виджетах ListView ListView будут сохранены представления, полученные из метода getView адаптера во внутреннем классе RecycleBin.
Как очистить представления в RecycleBin и заставить ListView воссоздать все дочерние представления.
Если я правильно помню, вызов invalidate на виджет ListView будет очищать кеш Views, который в настоящее время хранится. Я бы посоветовал не опустошать кеш просмотров ListView из-за потенциальных проблем с производительностью.
Если вы не собираетесь использовать элемент convertView, тогда вам будет нужно каждый раз создавать представление строки (в результате получается много объектов, созданных каждый раз, когда пользователь прокручивает) + дополнительная занимаемая память по переработанным представлениям из RecycleBin, которые никогда не будут использоваться в любом случае.
Вызов 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 );
В ListView - reclaimViews(List<View>) есть специальный метод. Он перемещает все элементы, которые в настоящее время используются и в корзине, в указанный список. Widget будет запрашивать новые представления для элементов из Adapter перед рендерингом в следующий раз.
Вы можете использовать восстановленные представления, если изменений в структуре элементов не так много или полностью их обрывать. Например, я использую этот метод для динамического обновления фона для элементов, когда пользовательский цвет выбора был изменен.
Удалите объект корзины из ArrayList или структуру данных, которую вы использовали в своем пользовательском адаптере, а также вызовите метод notifyDataSetChanged вашего адаптера.