webentwicklung-frage-antwort-db.com.de

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

Mein Buch "Hallo Android" gibt dies als eine Möglichkeit, einen benutzerdefinierten DB-Helfer zu verwenden, einen Cursor einzurichten und dann einen Adapter wie folgt einzurichten:

Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
        cursor = getData();
        showData(cursor);
} finally {
        test.close();
}

Bei diesem Vorgang muss ich jedoch jedes Mal, wenn ich den Datensatz aktualisieren muss, diesen Codeblock ausführen (der innerhalb eines onClick () etwas schwieriger wird, weil "dieser" nicht verfügbar ist.).

Ist dies der beste Weg, um den Datensatz zu aktualisieren, oder sollte ich die .close entfernen und einen adapter.notifyDataSetChanged () ausgeben? Wenn ich das tue, bekomme ich manchmal eine Kraft nahe (und ich kann mich im Moment nicht erinnern), aber manchmal kann es nicht richtig gelöscht werden. Ich denke, das liegt möglicherweise daran, dass die Datenbank derzeit geöffnet ist und versucht, sie erneut zu öffnen.

Sollten wir auch die Variablen für die Cursors, DatabaseHelpers und den Adapter in der Klasse (außerhalb von OnCreate) deklarieren, damit sie für alle Funktionen verfügbar sind?

Mir ist klar, dass dies zu diesem Zeitpunkt nur eine schlechte Programmierung ist, aber ich versuche, ein paar Hinweise zu bekommen, wie man die Dinge am besten macht.

60
Simon

Sie sollten adapter.notifyDataSetChanged() verwenden. Was sagt das Protokoll, wenn Sie das verwenden?

91
Macarse

Fügen Sie einfach diesen Code hinzu, bevor Sie einstellen, dass Adapter für mich funktioniert:

    listView.destroyDrawingCache();
    listView.setVisibility(ListView.INVISIBLE);
    listView.setVisibility(ListView.VISIBLE);

Oder Direkt können Sie die nachstehende Methode nach der Änderung der Datenressource verwenden.

   adapter.notifyDataSetChanged()
16
sravan

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

Beim Aufruf von notifyDataSetChanged () werden nicht nur die ListView-Daten aktualisiert. setAdapter() muss aufgerufen werden, bevor die Informationen korrekt geladen werden können:

  listView.setAdapter(adapter);
  adapter.notifyDataSetChanged();
12
Elenasys

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);
10
Hims
adapter.notifyDataSetChanged();
1
Dinesh Saini

Wenn nichts funktioniert, erstellen Sie einfach die Adapterinstanz erneut mit den neuen Ergebnissen oder den aktualisierten Ergebnissen. Dann sehen Sie die neue Ansicht.

XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);

adbXzy.notifyDataSetChanged();
1

Wenn Sie LoaderManager verwenden, versuchen Sie es mit dieser Anweisung:

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

Schreiben Sie einfach in Ihre benutzerdefinierte 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();
}
0
SAHOOD SSA

Vielleicht ist ihr Problem der Moment, wenn die Suche in der Datenbank durchgeführt wird. Um herauszufinden, in seinem Fragment Override Zyklen von Fragment.Java: Versuchen Sie es 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; 
}

Probiere es gleich Log.i ... "onStart" und "onResume".

Zum Schluss den Code in "onCreate" ausschneiden und zum Beispiel in "onStart" eingeben:

@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
André da Silva