2017-02-08 16 views
0

Ich versuche die ArrayList zu aktualisieren, um sie in der ListView aus meiner SQLite-Datenbank anzuzeigen, aber die Liste ist leer. Die SQLite funktioniert einwandfrei, da die Daten in den Protokollen angezeigt werden, aber nicht in der Liste hinzugefügt werden.ArrayList wird nicht aktualisiert

Eine Sache, die ich hinzufügen möchte, ist, dass ich diese Liste auch mit Parse verbunden habe, um Daten online zu erhalten und es in meiner Datenbank für die Offline-Verfügbarkeit zu speichern.

Die Liste wird aktualisiert, wenn Daten von Parse abgerufen werden.

public void listUpdater() { 

    Cursor c = myDB.rawQuery("SELECT * FROM user", null); 

    int titleIndex = c.getColumnIndex("title"); 

    titles.clear(); 

    if (c.moveToFirst()){ 

     do { 

      Log.i("RESULT: ",c.getString(titleIndex)); 

      titles.add(c.getString(titleIndex)); 




     } while (c.moveToNext()); 


     adapter.notifyDataSetChanged(); 


    } 

} 

Hier ist der Aufruf der Methode für die Daten

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_logged_in); 


     myDB = openOrCreateDatabase("Users", MODE_PRIVATE, null); 
     myDB.execSQL("CREATE TABLE IF NOT EXISTS user(title VARCHAR)"); 

     adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, titles); 

     listView = (ListView) findViewById(R.id.listUsers); 
     listView.setAdapter(adapter); 


     listUpdater(); 

     titles.clear(); 

// After this the list is updated from Parse 

} 

Antwort

0

Ich empfehle AsyncTask für dieses Problem zu verwenden. Holen Sie die Daten aus Ihrer Datenbank in doInBackground() und aktualisieren Sie die UI/Liste in onPostExecute().

Für weitere Informationen oder Beispiele überprüfen this

+0

Vielen Dank hilft. Das hat meine Probleme gelöst. Aber wieso hat es meine Methode nicht richtig genannt? –

+0

Ich denke es liegt an der 'onCreate()'. Die Benutzeroberfläche wurde zu dem Zeitpunkt, zu dem Sie die Benutzeroberfläche aktualisieren wollten, nicht erstellt. Also erst UI erstellen, dann Daten holen (async, so dass es kein Einfrieren gibt -> Ladedialog oder ähnliches anzeigen), dann UI aktualisieren;) – beeb

0

vor allem .. warum sollten Sie den Adapter setzen müssen, bevor Sie die Daten abrufen. Du könntest so etwas tun.

  1. zeigen einen Ladedialog.
  2. holen Sie die Daten aus db oder online/JSON
  3. analysieren Sie es.
  4. initialisieren Sie den Adapter
  5. setzen Sie den Adapter auf die Ansicht.
  6. für den Fall, dass Sie die Liste aktualisieren müssen. tue a notifyItemChanged (fromPos, list.size());

Hoffnung, die

+0

Ich möchte meine Daten auch offline hinzufügen, wenn die Internetverbindung nicht funktioniert verfügbare Benutzer können ihre zuvor geladenen Daten weiterhin anzeigen. Sag mir, ob es in meinem Fall einen Workaround dafür gibt. Danke –

+0

Ja .. du kannst es auch tun. Verwenden Sie in diesem Fall asynctask, wenn Sie dem Benutzer die Freiheit geben möchten, während der Vorbereitung Ihrer Daten alles zu tun, was er möchte. –