ListView no muestra los cambios hasta que el foco cambia después de notifyDataSetChanged
Yo tengo unAlertDialog
con unListView
establecer en selección múltiple en él. También tiene unButton
en eso.
losButton
abre otroAlertDialog
que si está bien, eliminará los elementos seleccionados del conjunto de datos delListView
, y luego decirle al adaptador de la vista de lista que el conjunto de datos ha cambiado con elnotifyDataSetChanged()
método.
Todo esto funciona bien, excepto por una cosa. losListView
no actualiza su contenido hasta que interactúo con algo. Luego se actualiza a los datos correctos.
Este no es un gran problema, pero realmente me gustaríaListView
para que parezca correcto de inmediato, y no solo después de que haya cambiado el enfoque.
Código:
Button remove = (Button) view.findViewById(R.id.btn_remove_questions_edit_rack);
final Context con = this;
remove.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Builder warnBuild = new Builder(con);
warnBuild.setMessage(R.string.question_deletion_warning);
warnBuild.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
SparseBooleanArray checked = list.getCheckedItemPositions();
for (String s : keys)
{
int i = keys.indexOf(s);
if (checked.get(i))
{
toRemove.add(map.get(s));
map.remove(s);
}
}
keys.clear();
keys.addAll(map.keySet());
((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();
list.clearChoices(); //This makes sure the selection is cleared, if it isn't, some of the other items (those that now has the index of the selected items) will be selected when the View refreshes.
dialog.dismiss();
}
});
//Negative button here, not relevant.
}
});
Dóndemap
ykeys
son:
final HashMap<String, QualityQuestion> map = new HashMap<>();
//I add items to the map
final ArrayList<String> keys = new ArrayList<>(map.keySet());
YtoRemove
es donde guardo los elementos que se eliminarán del objeto real en el que están cuando el botón ok en el originalAlertDialog
se presiona.
Así es como llego miListView
en primer lugar:
final ListView list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
list.setAdapter(
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_activated_1,
keys));
He intentado cosas comolist.invalidateViews()
, list.invalidate
y otras cosas que encontré en preguntas similares a las mías aquí en SO. Pero nada de eso hizo ninguna diferencia. Sospecho que mi problema es diferente al de ellos, ya que mis artículos están claramente actualizados, solo requiere un cambio de enfoque en el originalAlertDialog
para que el cambio sea visible.
¿Cómo puedo hacer elListView
¿Muestra los cambios en su fuente de datos inmediatamente después de un cambio de enfoque?