Como Romain individuo explained a while espalda durante el Google I/O session, la forma más eficiente para actualizar un único punto de vista en una vista de lista es algo así como lo siguiente (éste actualizar el conjunto View
datos):
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;
}
Suponiendo target
es un elemento del adaptador.
Este código de recuperar el ListView
, a continuación, busque los puntos de vista que se muestran actualmente, comparar el elemento target
que busca con cada muestra la vista elementos, y si su objetivo es entre aquellos, obtener la vista de cerramiento y ejecutar el adaptador getView()
en ese ver para actualizar la pantalla.
Como nota al margen invalidate()
no funciona igual que algunas personas que esperan y no actualizar la vista como getView()
hace, notifyDataSetChanged()
reconstruirá toda la lista y terminan llamando getview()
por cada elementos que se muestran y invalidateViews()
también afectará a un montón.
Una última cosa, uno también puede obtener un rendimiento adicional si solo necesita cambiar un elemento secundario de una vista de fila y no toda la fila como getView
.En ese caso, el siguiente código puede reemplazar list.getAdapter().getView(i, view, list);
(ejemplo para cambiar un texto TextView
):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
en código confiamos.
"¿Hay alguna manera de volver a dibujar esa fila sin llamar a listview.notifydatasetchanged()?" - Simplemente búscalo como un elemento secundario del 'ViewGroup' (en este caso,' ListView') y modifícalo. "Intenté llamar a view.invalidate() en la vista (dentro de linearlayout) pero no vuelve a dibujar la fila". - ¿Estás seguro de que tienes la fila correcta? Ni siquiera debería necesitar llamar 'invalidate()', AFAIK. – CommonsWare
Definitivamente tengo la fila correcta y la vista correcta. Creo que mi problema es que mi oyente de preferencia es basura. Lo cambié, así que llamé a notifyDataSetChanged() en onResume() de mi actividad, que resuelve el problema que estaba tratando de corregir. – Falmarri