2010-11-16 22 views
48

Mein Buch „Hallo Android“ gibt dies als eine Möglichkeit, einen benutzerdefinierten db Helfer zu verwenden, um einen Cursor einrichten, und dann ein Adapter Einrichtung wie folgt:bester Weg Adapter/Listview auf Android aktualisieren

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

Mit diesem jedoch muss ich jedes Mal, wenn ich den Datensatz aktualisieren muss, diesen Codeblock laufen lassen (was in einem onClick() für eine Schaltfläche etwas schwierig wird, weil "dieser" nicht verfügbar ist.

Ist dies der beste Weg, um den Datensatz zu aktualisieren, oder sollte ich versuchen, die .close zu entfernen und ein adapter.notifyDataSetChanged() ausstellen? Wenn ich dies tue, bekomme ich manchmal eine Kraft zu schließen (und ich kann nicht erinnere mich im Moment), aber manchmal kann es nicht richtig löschen - ich denke, das kann daran liegen, dass die Datenbank gerade geöffnet ist und versucht, sie wieder zu öffnen.

Sollen wir auch die Variablen für die Cursor, DatabaseHelpers und Adapter in der Klasse deklarieren (außerhalb von OnCreate), damit sie für alle Funktionen zugänglich sind?

Ich weiß, das ist nur schlechte Programmierung in diesem Stadium, aber ich versuche, ein paar Hinweise auf die beste Art, Dinge zu tun.

+0

Nur eine Bemerkung am Rande: Dinge ein wenig anders sind, wenn Sie Content-Provider und LoaderManager verwenden. Siehe: http://StackOverflow.com/a/19657500/1087411 – Anderson

Antwort

81

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

+1

Danke Macarse, das funktioniert, aber nur, wenn ich keine .close auf den Datenbankhelfer mache. Ich denke auch, was passiert, wenn ich den .close nicht mache, versucht das System zu viele Datenbanken zu öffnen und fällt um. Sollte die Datenbank während des gesamten Lebenszyklus der Aktivität geöffnet sein? – Simon

+0

Sie sollten http://developer.android.com/reference/android/app/Activity.html#startManagingCursor(android.database.Cursor) verwenden, um den Cursor innerhalb einer Aktivität zu verwalten. – Macarse

9

folgender Code funktioniert perfekt für mich

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter(); 
adp.UpdateDataList(EfficientAdapter.MY_DATA); 
adp.notifyDataSetChanged(); 
QuickList.invalidateViews(); 
QuickList.scrollBy(0, 0); 
+1

Der Aufruf von notifyDataSetChanged() war nicht ausreichend für mich. InvalidateViews() funktioniert stattdessen. –

16

einfach diesen Code hinzufügen, bevor Adapter Einstellung es funktioniert für mich:

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

oder direkt können Sie unter Verfahren nach Änderung Datenressource verwenden.

adapter.notifyDataSetChanged() 
+1

Dies gilt auch für Schaltflächen: \t \t // Force aktualisieren \t \t myButton.setVisibility (Button.INVISIBLE); \t \t myButton.setVisibility (Button.VISIBLE); – hornetbzz

+1

für welchen Zweck müssen Sie Ihre Schaltfläche aktualisieren? – sravan

+0

nach einem Filter und dann wird die Umkehrung angewendet. – hornetbzz

0

Wenn Sie mit LoaderManager mit dieser Aussage versuchen:

public void swapItems(ArrayList<Item> arrayList) { 
    this.clear(); 
    this.addAll(arrayList); 
} 
-2

gerade in Ihrer benutzerdefinierten ArrayAdaper diesen Code schreiben Die Suche wird in der Datenbank durchgeführt. In seinem Fragment Aufschalten Zyklen seiner Fragment.java nur um herauszufinden: versuchen Tests mit den 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; 
} 

Probieren Sie es Log.i ähnlich setzen ... „onStart“ und „onResume“.

schnitt schließlich den Code in "onCreate" e steckte es in "onStart" zum Beispiel:

@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
adapter.notifyDataSetChanged(); 
+0

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". – abarisone

+0

on Suchen Sie Adapter aktualisieren? –

0

Vielleicht ihr Problem ist der Moment, wenn:

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

Schreiben Sie einfach in Ihrem benutzerdefinierten 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(); 
} 
5

besten Weg, um Refresh Adapter/ListView auf Android

Nicht nuranrufenwird das Listview-Daten aktualisieren, setAdapter() muss aufgerufen werden, bevor die Informationen richtig zu laden:

listView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
Verwandte Themen