2016-04-17 4 views
-1

Ich versuche, eine einfache Kontakte-App zu erstellen, und habe ein Problem beim Abrufen von Daten aus einer Datenbank in eine Liste von Objekten festgestellt. Ich habe versucht, es ohne Objekte zu machen, und dann habe ich bemerkt, dass dieser Weg in der Praxis mehr genutzt wird. In dieser App möchte ich den Namen des Kontakts in einer Listenansicht anzeigen.Wie erhalte ich Daten aus einer Datenbank in eine Liste von Objekten und zeige sie in einer Listenansicht an?

So, hier ist mein Code:

public List<Contact> getAllContacts() { 
    List<Contact> contactList = new ArrayList<Contact>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Contact contact = new Contact(); 
      contact.setID(Integer.parseInt(cursor.getString(0))); 
      contact.setName(cursor.getString(1)); 
      contact.setPhoneNumber(cursor.getString(2)); 
      // Adding contact to list 
      contactList.add(contact); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return contactList; 
} 

Methode in meiner MainActivity Daten abzurufen (hier etwas nicht in Ordnung ist, aber kann es nicht herausfinden:

public class Contact { 

//private variables 
int _id; 
String _name; 
String _phone_number; 

// Empty constructor 
public Contact(){ 

} 

public Contact(String name){ 

    this._name=name; 

} 

// constructor 
public Contact(int id, String name, String _phone_number){ 
    this._id = id; 
    this._name = name; 
    this._phone_number = _phone_number; 
} 

// constructor 
public Contact(String name, String _phone_number){ 
    this._name = name; 
    this._phone_number = _phone_number; 
} 
// getting ID 
public int getID(){ 
    return this._id; 
} 

// setting id 
public void setID(int id){ 
    this._id = id; 
} 

// getting name 
public String getName(){ 
    return this._name; 
} 

// setting name 
public void setName(String name){ 
    this._name = name; 
} 

// getting phone number 
public String getPhoneNumber(){ 
    return this._phone_number; 
} 

// setting phone number 
public void setPhoneNumber(String phone_number){ 
    this._phone_number = phone_number; 
} 

@Override 
public String toString() { 
    return _name; 
} 

} 

Methode in meiner DBHandler alle Daten abrufen):

public void printDatabase() { 


    List<Contact> listOfContacts = handler.getAllContacts(); 
    for (Contact cn : listOfContacts) { 

     cn.getName(); 
     listOfContacts.add(cn); 


    } 




} 
+0

Sind Sie sicher, dass Sie alle Kontakte in der 'listofContacts' Liste bekommen? Welches Problem haben Sie? Sende dein Logcat. – Yashasvi

+0

Kontaktname wird nicht in der Listenansicht – Nenco

Antwort

1

zwei Probleme:

1) Wie @RaviTeja gezeigt hat, führen Sie alle Ihre Initialisierung in onCreate() -Methode, nicht innerhalb einer Schleife. Dann rufen Sie notifydatasetchanged().

2) die offizielle Dokumentation von ArrayAdapter Zitiert:

jedoch die Textview verwiesen wird, wird es mit dem toString() für jedes Objekt in dem Array gefüllt werden. Sie können Listen oder Arrays von benutzerdefinierten Objekten hinzufügen. Überschreiben Sie die toString() - Methode Ihrer Objekte auf , um festzustellen, welcher Text für das Element in der Liste angezeigt wird.

Sie wissen also, was zu tun ist. Implementieren Sie die Methode ToString() in Ihrer Contact Klasse so etwas wie:

public String toString() 
{ 
    return "name: "+_name; 
} 
+0

angezeigt, so dass ich die ToString-Methode wie im aktualisierten Thema angezeigt hinzugefügt. und ich habe auch den listview-Teil in die on create-Methode verschoben und die for-Schleife entfernt. Wie sollte meine printDatabase-Methode aussehen? Weil ich es ziemlich oft benutze (nach dem Löschen von Kontakten, Hinzufügen usw ..) – Nenco

+0

Gemäß Ihrem Anwendungsfall sollte Ihre Druckdatenbank nur die Liste im Adapter aktualisieren und 'notifydatasetchanged()' Methode aufrufen. – Yashasvi

+0

vielen Dank für die Hilfe Jungs – Nenco

1

Sie müssen Ihre Listview und Adapter innerhalb einer Schleife nicht initialisiert werden.

listView = (ListView) findViewById(R.id.listview); //global 
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,listOfContacts); 
listView.setAdapter(adapter); 

Bewegen Sie den obigen Teil des Codes aus der für loop.No Notwendigkeit eines loop.Place dieser Code in Ihre onCreate() und erklären Adapter adapter.notfiyDataSetChanged() nachdem die Kontakte zusätzlich zu den list.This globally.Then nennen wird Aktualisieren Sie die Liste.

Verwandte Themen