Listview + BaseAdapter - как уведомить об изменении в одном элементе? - PullRequest
4 голосов
/ 15 ноября 2011

У меня есть представление списка, подаваемое BaseAdapter.

Когда что-то меняется в данных, я вызываю BaseAdapter.notifyDataSetChanged.Все работает отлично.

Теперь мне интересно, если я изменю какую-то крошечную деталь в каком-либо элементе списка, есть ли какой-нибудь оптимизированный способ обновить вид отдельного элемента, если он отображается на экране ?Я предполагаю, что notifyDataSetChanged вслепую перестраивает представления всех видимых элементов в списке, что не является оптимальным, если происходит тривиальное изменение элемента.

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Нет, я думаю, это невозможно, если вы не реализуете собственное расширение класса ListView. Здесь есть исходный код для setAdapter().

Вы увидите, ListView регистрируется только как наблюдатель, используя mAdapter.registerDataSetObserver(mDataSetObserver); А DataSetObserver не предоставляет средств для уведомления об изменении в определенной позиции.

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

0 голосов
/ 24 июля 2013

Да, есть способ. Предполагая, что я могу идентифицировать элемент списка, например, присваивая View.setTag ему какое-то значение, я могу перебирать элементы списка и, если необходимо, перепривязывать только один элемент списка или даже обновлять только некоторое подвид представления элемента.

Это просто и относительно дешево (линейный поиск):

for(int i = list.getChildCount(); --i>=0; ){
   View v = list.getChildAt(i);
   Object id = v.getTag();
   if(id==myId){
      updateListItem(id, v);
      break;
   }
}

где myId - это некоторый идентификатор элемента, который я хочу обновить, а updateListItem вносит необходимые изменения в элемент списка. Доказано, работает отлично и очень эффективно.

...