Actualización de la vista de lista cuando cambian los datos del adaptador

Cuando se modifican los datos asociados con el adaptador de matriz, ¿invalidar la vista de lista es suficiente para mostrar los valores actualizados? La siguiente pieza de código no funciona, ¿he entendido mal algo aquí?

public class ZeroItemListActivity extends Activity { private ArrayList listItems=new ArrayList(); private ListView mMyListView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMyListView=(ListView) findViewById(R.id.MyListView); mMyListView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,listItems)); } public void addItem(View v){ listItems.add("list Item"); mMyListView.invalidate(); } } 

Diseño utilizado:

       

sustituir:

 mMyListView.invalidate(); 

para:

 ((BaseAdapter) mMyListView.getAdapter()).notifyDataSetChanged(); 

Si eso no funciona, consulte este hilo: actualización de la vista de lista de Android

Cambiar esta línea:

 mMyListView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, listItems)); 

a:

 ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, listItems) mMyListView.setAdapter(adapter); 

y después de actualizar el valor de un elemento de la lista, llame al:

 adapter.notifyDataSetChanged(); 

invalidate(); llama a la vista de lista para invalidarse (es decir, color de fondo)
invalidateViews(); llama a todos sus hijos a ser invalidados. permitiéndole actualizar las vistas de los niños

Supongo que es un tipo de eficiencia que evita que todos los elementos tengan que volverse a dibujar constantemente si no es necesario.

Encontré una solución que es más eficiente que la respuesta actualmente aceptada, porque la respuesta actual obliga a actualizar todos los elementos de la lista. Mi solución actualizará solo un elemento (que fue tocado) llamando a los adaptadores getView y reciclando la vista actual, lo que agrega aún más eficiencia.

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // Edit object data that is represented in Viewat at list's "position" view = mAdapter.getView(position, view, parent); } });