Suche Vorschläge von Netzwerk-Ressource in das Feld für die Schnellsuche
Baue ich die Suche in einer Anwendung und müssen einen Weg zu haben, setzen die Anregungen, die ich von meinem server als JSON-array in die Liste der Vorschläge, die angezeigt wird, unter dem Feld für die Schnellsuche.
Gibt es einen einfachen Weg, um die quick search box Lesen solcher Ressourcen?
Derzeit bin ich versucht, einen ContentProvider, aber die interface-Methoden zeigen deutlich, man soll das Abfragen einer Datenbank, um die Vorschläge. Ich denke, mit einem ContentProvider ist der richtige Weg, wenn Sie auf der Suche sind die Daten gespeichert, die innerhalb der Anwendung. Ich bin nicht so sicher, jedoch, dass dies der richtige Weg ist, wenn Sie müssen zur Abfrage einer Netzwerk-Ressource.
Macht es keinen Sinn für mich, speichern Sie die Anregungen, die ich aus dem Netzwerk auf eine lokale Datenbank, als die Vorschläge und Ihre Trefferquote wird von Zeit zu Zeit variieren.
Jemand dieses Problem gehabt? Oder kann mir in die Richtung, in der eine ähnliche Frage? Ich konnte nicht finden, Fragen hier auf dem Stapel, genannt Netzwerk-Vorschläge.
- Schauen Sie hier: stackoverflow.com/questions/2123743/... - ich glaube, das, was u tun könnten: wenn der Benutzer text eingegeben hat, wartet N Millisekunden (msec), dann aufpumpen ein be-Fenster unter dem Textfeld (...), starten Sie eine asynctask zum abrufen der Ergebnisse, am Ende der asynctask ersetzen laden Ansicht mit einem listview-Ergebnisse. (cache-listview auf der Grundlage der Suchabfrage).
- Ich denke, das ist eine Lösung, die zumindest auf, wie die Ergebnisse angezeigt. Jedoch bin ich mehr auf der Suche nach einer Lösung, wie Sie implementieren können, ein ContentProvider und fügen Sie meine eigenen Vorschläge, wie Sie hier tun: developer.android.com/guide/topics/search/.... Nur, dass die Vorschläge stammt von einer Netzwerk-Ressource und nicht die Daten in meine Anwendung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung gefunden auf developer.android.com:
Wenn Sie Anregungen haben, die Sie von einem Speicherort im Netzwerk, Sie können eine cursor auf die Fliegen, wenn Sie die Ergebnisse, die von Ihrem server.
Diese geht in Ihrem ContentProvider die query () - Methode:
Den cursor verwendet, die in der quick-search-box zu füllen eine Liste mit Vorschlägen.
Hier ist ein Beispiel von SearchView mit Anregungen kommen von einem Netzwerk-Dienst (ich habe Nachrüstung):
Weiß nicht, ob man das noch brauchen. Nur für den Fall, für zukünftige Forscher. Ich hatte ein problem mit meinem SearchView Vorschläge, die nicht zeigen, bis. Nach suchte herum, fand ich eine Lösung für dieses. Ich verwendet Volley für meine content-provider-Klasse (um die Vorschläge von web-api), das schien nicht zu passen natürlich in den Android-content-provider framework. Ich fand auch, dass meine Inhalte-Anbieter HAT die Ausführung im UI-thread. Also, wenn ich Volley Zukunft synchron, es verlangsamt (gesperrt) der UI, bis die Anfrage zurück (timeout). Darüber hinaus fand ich Informationen rund um das web, dass Volleyball die Zukunft der Antrag sollte ausgeführt werden, im anderen thread, wie in eine Asynchrone Aufgabe, für die es gut funktioniert. So, es hat nicht mein problem zu lösen, denn wenn ich hätte, es zu benutzen (in einem async task), würde ich verwendet haben-Volleyball normalen (asynchronen) request in der ersten Stelle (das war das, was ich dann).
Was ich Tat, war dies:
In meinem ContentProvider Unterklasse, definiere ich eine listener-Schnittstelle:
öffentliche Schnittstelle ResultListener {
}
In meiner Tätigkeit (was umgesetzt LoaderCallbacks), habe ich implementiert, die sich auch über die Schnittstelle.
In meiner singleton-application-Klasse definiert eine statische variable, die als transiente Daten, zusammen mit Ihren getter - /setter-Methoden:
private static HashMap transientData = new HashMap();
public static Object getTransientData(String objectName) {
}
public static void setTransientData(String objectName, Object Object) {
}
In der Aktivität, vor dem Aufruf getSupportLoaderManager().initLoader(...),
Ich rief MyApplication.setTransientData("requestor", this) :
In meinem content-provider-Klasse, in der volley Anfrage onResponse Rückruf, habe ich dies getan:
public void onResponse(JSONArray response){
}
So, dass, wenn die Volleyball-Anforderung zurückgegeben wird, löst Sie den requestor-callback-Methode auf, übergeben Sie den cursor gefüllt mit Daten aus der Antwort, und im Gegenzug die Anforderer (die Aktivität) benannte den cursor adapter durch Aufruf von:
- adapter.swapCursor(c);
- adapter.notifyDataSetChanged();
Hoffe, das jemand hilft.
Gesegnet sein.