Как объяснил Ромен Гай некоторое время назад во время сеанса ввода-вывода Google , наиболее эффективный способ обновить только одно представление в представлении списка - это что-то вроде следующего (это одно обновление всего представления данных):
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
if(target==list.getItemAtPosition(i)){
View view = list.getChildAt(i-start);
list.getAdapter().getView(i, view, list);
break;
}
Предполагается, что target
является одним элементом адаптера.
Этот код извлекает ListView
, затем просматривает отображаемые в данный момент представления, сравнивает искомый элемент target
с каждым отображаемым элементом представления, и, если ваша цель находится среди них, получите включающее представление и выполните адаптер getView
в этом представлении для обновления дисплея.
В качестве примечания invalidate
не работает, как ожидают некоторые люди, и не обновляет представление, как это делает getView, notifyDataSetChanged
перестроит весь список и в итоге вызовет getview
для всех отображаемых элементов и invalidateViews
также повлияет на группу.
И последнее: можно получить дополнительную производительность, если ему нужно только изменить дочерний элемент представления строки, а не всю строку, как getView
. В этом случае следующий код может заменить list.getAdapter().getView(i, view, list);
(пример изменения текста TextView
):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
В коде мы доверяем.