Ich habe eine AlertDialog
mit einem ListView
Satz zur Mehrfachauswahl drauf. Es hat auch eine Button
drauf.
Die Button
andere offen , AlertDialog
dass , wenn ok'ed wird die ausgewählten Elemente aus dem Datensatz der entfernen ListView
, und dann dem Adapter aus der Listenansicht sagen , dass der Datensatz mit der geändert hat notifyDataSetChanged()
Methode.
Dies alles funktioniert gut, bis auf eine Sache. Der ListView
Inhalt wird erst aktualisiert, wenn ich mit etwas interagiere. Dann wird es auf die richtigen Daten aktualisiert.
Dies ist kein großes Problem, aber ich möchte wirklich, dass das ListView
sofort korrekt erscheint und nicht erst, nachdem sich der Fokus geändert hat.
Code:
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.
}
});
Wo map
und keys
sind:
final HashMap<String, QualityQuestion> map = new HashMap<>();
//I add items to the map
final ArrayList<String> keys = new ArrayList<>(map.keySet());
Und toRemove
hier speichere ich die Elemente, die aus dem eigentlichen Objekt entfernt werden sollen, auf dem sie sich befinden, wenn die OK-Taste auf dem Original AlertDialog
gedrückt wird.
So bevölkere ich meine ListView
in erster Linie:
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));
Ich habe Dinge wie und andere Dinge ausprobiert list.invalidateViews()
, die list.invalidate
ich in Fragen gefunden habe, die meinen hier auf SO ähnlich sind. Aber nichts davon machte einen Unterschied. Ich vermute, dass sich mein Problem von ihrem unterscheidet, da meine Artikel eindeutig aktualisiert wurden. Es ist lediglich eine Änderung des Fokus auf das Original erforderlich, damit AlertDialog
die Änderung sichtbar wird.
Wie kann ich ListView
die Änderungen der Datenquelle nach einer Fokusänderung sofort anzeigen lassen?
Durch einen Anruf
((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();
Sie erhalten einen neuen Adapter, der mit ziemlicher Sicherheit nicht mit dem anonymen Adapter identisch ist, mit dem Sie Ihre Liste in erster Linie gefüllt haben.
Siehe auch die Dokumentation zu ListView.getAdapter ()
Gibt den derzeit in dieser ListView verwendeten Adapter zurück. Der zurückgegebene Adapter ist möglicherweise nicht derselbe Adapter, der an setAdapter (ListAdapter) übergeben wurde, sondern möglicherweise ein WrapperListAdapter.
Aus Sicht dieses neuen Adapters hat sich der Datensatz nicht geändert, da die Änderungen bereits vor der Instanziierung vorgenommen wurden.
Um Ihr Problem zu lösen, machen Sie Ihre Liste und Ihren Listenadapter zu Mitgliedern Ihrer Aktivitätsklasse (oder zu dem Bereich, in dem Sie sie am Leben erhalten möchten):
private ArrayList<String> keys;
private ArrayAdapter myAdapter;
private ListView list;
Dann in Ihrem "onCreate ()"
keys = ...; // initialization of ArrayList with the needed data
myAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_activated_1,
keys);
list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
list.setAdapter(myAdapter);
Auf diese Weise können Sie in Ihrem "OnClickListener" "myAdapter" benachrichtigen:
keys.addAll(map.keySet());
myAdapter.notifyDataSetChanged();
Hoffe das hilft :)
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen