In meinem Buch "Hallo Android" können Sie einen benutzerdefinierten Datenbank-Helfer verwenden, einen Cursor einrichten und anschließend einen Adapter wie folgt einrichten:
Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
cursor = getData();
showData(cursor);
} finally {
test.close();
}
Damit muss ich jedoch jedes Mal, wenn ich den Datensatz aktualisieren muss, diesen Codeblock weiter ausführen (was in einem onClick () für eine Schaltfläche etwas schwierig wird, da "dies" nicht verfügbar ist.
Ist dies der beste Weg, um den Datensatz zu aktualisieren, oder sollte ich versuchen, die .close zu entfernen und einen adapter.notifyDataSetChanged () auszugeben? Wenn ich das mache, bekomme ich manchmal eine Kraft in der Nähe von (und ich kann mich im Moment nicht erinnern), aber manchmal kann sie nicht richtig gelöscht werden - ich denke, das liegt möglicherweise daran, dass die Datenbank gerade geöffnet ist und versucht, sie erneut zu öffnen.
Sollten wir auch die Variablen für die Cursor, DatabaseHelpers und Adapter in der Klasse (außerhalb von OnCreate) deklarieren, damit sie für alle Funktionen zugänglich sind?
Mir ist klar, dass dies zu diesem Zeitpunkt nur eine schlechte Programmierung ist, aber ich versuche, einige Hinweise zu bekommen, wie man die Dinge am besten macht.
Antworten:
Sie sollten verwenden
adapter.notifyDataSetChanged()
. Was sagen die Protokolle, wenn Sie das verwenden?quelle
Fügen Sie einfach diesen Code hinzu, bevor Sie festlegen,
Adapter
dass er für mich funktioniert:listView.destroyDrawingCache(); listView.setVisibility(ListView.INVISIBLE); listView.setVisibility(ListView.VISIBLE);
Oder Sie können die folgende Methode direkt verwenden, nachdem Sie die Datenressource geändert haben.
adapter.notifyDataSetChanged()
quelle
Wenn Sie nicht nur notifyDataSetChanged () aufrufen, werden die ListView-Daten aktualisiert. Sie
setAdapter()
müssen zuvor aufgerufen werden, um die Informationen korrekt zu laden:listView.setAdapter(adapter); adapter.notifyDataSetChanged();
quelle
Der folgende Code funktioniert perfekt für mich
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter(); adp.UpdateDataList(EfficientAdapter.MY_DATA); adp.notifyDataSetChanged(); QuickList.invalidateViews(); QuickList.scrollBy(0, 0);
quelle
adapter.notifyDataSetChanged();
quelle
Wenn nichts funktioniert, erstellen Sie einfach die Adapterinstanz erneut mit der neuen Ergebnismenge oder der aktualisierten Ergebnismenge. Dann können Sie die neue Ansicht sehen.
XYZAdapter adbXzy = new XYZAdapter(context, 0, listData); xyzListView.setAdapter(adbXzy); adbXzy.notifyDataSetChanged();
quelle
Wenn Sie LoaderManager verwenden, versuchen Sie Folgendes:
getLoaderManager().restartLoader(0, null, this);
quelle
Vielleicht ist ihr Problem der Moment, in dem die Suche in der Datenbank durchgeführt wird. In seinen Fragment Override-Zyklen von Fragment.java können Sie Folgendes herausfinden: Testen Sie mit den folgenden Methoden:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here Log.i("FragmentX", "Step OnCreateView");// Try with it return rootView; }
Versuchen Sie es ähnlich setzen
Log.i
... "onStart" und "onResume".Schneiden Sie den Code schließlich in "onCreate" aus und fügen Sie ihn beispielsweise in "onStart" ein:
@Override public void onStart(){ super.onStart(); Log.i("FragmentX","Step OnStart"); dbManager = new DBManager(getContext()); Cursor cursor = dbManager.getAllNames(); listView = (ListView)getView().findViewById(R.id.lvNames); adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter adapter.notifyDataSetChanged(); listView.setAdapter(adapter); }
quelle
Schreiben Sie einfach in Ihren Custom
ArrayAdaper
diesen Code:private List<Cart_items> customListviewList ; refreshEvents(carts); public void refreshEvents(List<Cart_items> events) { this.customListviewList.clear(); this.customListviewList.addAll(events); notifyDataSetChanged(); }
quelle
Schreiben Sie einfach diesen Code in Ihren Custom ArrayAdaper:
public void swapItems(ArrayList<Item> arrayList) { this.clear(); this.addAll(arrayList); }
quelle