O ListView não mostra alterações até que o foco seja alterado após notifyDataSetChanged
eu tenho umAlertDialog
com umListView
defina para seleção múltipla. Também tem umButton
nele.
oButton
abra outroAlertDialog
que, se estiver OK, removerá os itens selecionados do conjunto de dados doListView
e informe ao adaptador da exibição em lista que o conjunto de dados foi alterado com onotifyDataSetChanged()
método.
Tudo isso funciona bem, exceto por uma coisa. oListView
não atualiza seu conteúdo até que eu interaja com algo. Em seguida, ele atualiza para os dados corretos.
Este não é um grande problema, mas eu realmente gostaria que oListView
parecer correto de uma só vez, e não apenas depois que o foco for alterado.
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.
}
});
Ondemap
ekeys
estão:
final HashMap<String, QualityQuestion> map = new HashMap<>();
//I add items to the map
final ArrayList<String> keys = new ArrayList<>(map.keySet());
EtoRemove
é onde eu guardo os itens a serem removidos do objeto em que estão quando o botão ok no originalAlertDialog
está pressionado.
É assim que eu preencho meuListView
em primeiro 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));
Eu tentei coisas comolist.invalidateViews()
, list.invalidate
e outras coisas que encontrei em perguntas semelhantes às minhas aqui no SO. Mas nada disso fez diferença. Suspeito que meu problema seja diferente do deles, pois meus itens são atualizados com clareza, basta uma mudança de foco no originalAlertDialog
para que a alteração seja visível.
Como posso fazer oListView
mostrar as alterações em sua fonte de dados imediatamente após uma mudança de foco?