2010-07-22 11 views
8

Ist es möglich, einen SimpleAdapter zu aktualisieren? Ich habe eine Liste von Daten und eine Fußzeile mit der Aufschrift "Siehe nächste Ergebnisse". Wenn das Listenelement angeklickt wird, erfasse ich das Ereignis und erhalte neue Daten. Ich möchte dann die Daten in der ListView durch diese neuen Daten ersetzen, aber ich kann nicht herausfinden, wie es geht. Irgendwelche Ideen? Ich möchte keinen ArrayAdapter verwenden, denn soweit ich sehen kann, können die Elemente nur eine Zeichenkette enthalten, die mehrere Strings und Ints enthalten muss.Wie SimpleAdapter in Android zu aktualisieren

Antwort

10

aktualisieren: Nach del116, können Sie in der Tat SimpleAdapter eine veränderbare Karte geben und rufen Sie dann manuell die notifyDataSetChanged Methode des Adapters, wenn Sie die Liste aktualisieren müssen. Im Folgenden wird jedoch die Dokumentation von SimpleAdapter erläutert, in der angegeben wird, dass es sich um statische Daten handelt. Die Verwendung für veränderliche Daten widerspricht ihrem Design. Wenn Sie diese Technik verwenden, würde ich sicher sein, dass sie überprüft, ob sie in neuen Android-Versionen weiterarbeitet, sobald sie auftauchen.

(Original Kommentar folgt :)

Wenn Sie die SimpleAdapter description betrachten es sagt, es ist „Ein einfacher Adapter statische Daten zu Ansichten in einer XML-Datei definiert abzubilden.“ Ich habe die Betonung hinzugefügt - einfach gesagt, SimpleAdapater ist nicht für die Verwendung mit Daten, die sich ändert; Es verarbeitet nur statische Daten. Wenn Sie nicht verwenden können, weil Ihre Daten mehr als ein einzelnes Bit Text enthalten, müssen Sie entweder Ihre eigene benutzerdefinierte ListAdapter erstellen, oder Ihre Daten in eine DB eingeben und eines der CursorAdapter s verwenden.

Als letztes Mittel, wenn Sie nicht viel Leistung benötigen, können Sie könnte eine ListView von einem SimpleAdapter gesichert aktualisieren, indem Sie eine ganz neue SimpleAdapter Instanz Aufbau jederzeit Ihre Daten ändern und sagen, die Listenansicht, es zu benutzen über setListAdapter.

+4

Ihre Antwort hier ist wirklich irreführend. Nach dem Aktualisieren der Array-Daten und dem Aufruf von notifyDataSetChanged() auf meinem SimpleAdapter konnte ich den simpleAdapter aktualisieren. Sie müssen ArrayAdapter nicht verwenden, um notifyDataSetChanged() aufzurufen. – dell116

+1

@ dell116 Fair genug. Ich habe am Ende meiner Antwort auf diese Möglichkeit hingewiesen, aber ich habe sie aufgrund Ihrer Rückmeldung an die Spitze gebracht, dass sie tatsächlich funktioniert; Ich hatte es nicht getestet. Ich behaupte immer noch, dass das, was so etwas macht, etwas Vorsicht verdient, da die SimpleAdapter-Dokumentation ausdrücklich angibt, dass es sich um statische Daten handelt. –

+0

Wenn ich jetzt zurückschaue ... wow. Ich wusste nichts über Programmierung oder den beabsichtigten Zweck von SimpleAdapter. Wenn Sie ein ListView (oder ein anderes AdapterView) verwenden, das von einer Datenstruktur unterstützt wird, die sich ändert, verwenden Sie SimpleAdapter nicht. Fuß.inMouth (wahr); – dell116

2

SimpleAdapter ist für statische Daten gedacht, daher kann die Leistung variieren. Die beste Lösung ist wahrscheinlich, bei jedem Wechsel des Datasets zu einem anderen Adaptertyp zu wechseln, z. B. ArrayAdapter, oder einen neuen SimpleAdapter zu erstellen.

3
ListView lv= (ListView) findViewById(R.id.loglist); 
ArrayList<Map<String, String>> list = buildData(); 
String[] from = { "time", "message" }; 
int[] to = { R.id.logtime, R.id.logmessage }; 

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to); 
lv.setAdapter(adapter); 

Rufen Sie diese Funktion jedes Mal auf, um das ListView zu aktualisieren. Beachten Sie, dass Sie haben die Liste Variable mit neuen Daten zu aktualisieren ..

this helps .. :)

0

war ich nicht in der Lage zu bekommen notifyDataSetChanged() auf der Aktualisierung meinen SimpleAdapter zu arbeiten, so stattdessen habe ich versucht, zuerst alle Ansichten zu entfernen, die auf das übergeordnete Layout angebracht wurden mit removeAllViews(), dann das Listview-Zugabe, und das funktionierte, so dass ich die Benutzeroberfläche aktualisieren:

LinearLayout results = (LinearLayout)findViewById(R.id.results); 
ListView lv = new ListView(this); 
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.directory_row, 
        new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept }); 

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("dept", dept); 
    list.add(map); 
} 

lv.setAdapter(adapter); 
results.removeAllViews();  
results.addView(lv); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

verwenden Sie diese Zeile nach der Aktualisierung Daten in den Daten HashMap Liste

+0

Bitte lesen Sie die Dokumentation, nicht möglich auf SimpleAdapter wie oben erwähnt SimpleAdapter nicht für solche Aktionen gedacht. – Manny265

Verwandte Themen