Como Romain individuo explained a while back 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 de datos de la vista):
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 que 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.
Gracias. Esto funcionaría si estoy ** editando ** el diseño actual del niño. Pero, ¿qué sucede si quiero ** cambiar el diseño por completo ** (inflando un xml diferente)? Si llamo a 'newView (...)' en el adaptador, me da una vista diferente que sin embargo no se pone en 'listView'. – hadi
@hadi deberías echar un vistazo a esta respuesta: http://stackoverflow.com/a/11568271/858626 –