Beste Möglichkeit, Adapter / ListView auf Android zu aktualisieren


72

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.


Nur eine Randnotiz: Bei Verwendung von Inhaltsanbietern und LoaderManager sieht es etwas anders aus. Siehe: stackoverflow.com/a/19657500/1087411
Anderson

Antworten:


101

Sie sollten verwenden adapter.notifyDataSetChanged(). Was sagen die Protokolle, wenn Sie das verwenden?


1
Danke Macarse, das funktioniert, aber nur, wenn ich keine .close für den Datenbank-Helfer mache. Ich denke auch, was passiert, wenn ich die .close nicht mache, das System versucht zu viele Datenbanken zu öffnen und fällt um. Sollte die Datenbank dann über den gesamten Lebenszyklus der Aktivität geöffnet sein?
Simon

Sie sollten developer.android.com/reference/android/app/… verwenden , um Ihren Cursor innerhalb einer Aktivität zu verwalten.
Macarse

16

Fügen Sie einfach diesen Code hinzu, bevor Sie festlegen, Adapterdass 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()

1
Dies gilt auch für Buttons: // Aktualisierung erzwingen myButton.setVisibility (Button.INVISIBLE); myButton.setVisibility (Button.VISIBLE);
Hornetbzz

1
Zu welchem ​​Zweck müssen Sie Ihre Schaltfläche aktualisieren?
Sravan

nach einem Filter und dann wird seine Umkehrung angewendet.
Hornetbzz

13

Beste Möglichkeit, Adapter / ListView auf Android zu aktualisieren

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();

Wenn Sie setAdaper verwenden, müssen Sie notifyDataSetChanged
Arda

12

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);

2
Das Aufrufen von notifyDataSetChanged () war für mich nicht ausreichend. invalidateViews () funktioniert stattdessen.
Luca Carlon

2
adapter.notifyDataSetChanged();

Bitte bearbeiten Sie mit weiteren Informationen. Nur-Code- und "Versuch dies" -Antworten werden nicht empfohlen, da sie keinen durchsuchbaren Inhalt enthalten und nicht erklären, warum jemand "dies versuchen" sollte.
Abarisone

Bei der Suche möchten Sie den Adapter aktualisieren?
Dinesh Saini

2

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();

0

Wenn Sie LoaderManager verwenden, versuchen Sie Folgendes:

getLoaderManager().restartLoader(0, null, this);

0

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);
}

0

Schreiben Sie einfach in Ihren Custom ArrayAdaperdiesen Code:

private List<Cart_items> customListviewList ;

refreshEvents(carts);

public void refreshEvents(List<Cart_items> events)
{
    this.customListviewList.clear();
    this.customListviewList.addAll(events);
    notifyDataSetChanged();
}

-4

Schreiben Sie einfach diesen Code in Ihren Custom ArrayAdaper:

public void swapItems(ArrayList<Item> arrayList) {
    this.clear();
    this.addAll(arrayList);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.