Android 如何将数据从数据库获取到对象列表中并在listview中显示?

Android 如何将数据从数据库获取到对象列表中并在listview中显示?,android,Android,我正在尝试制作一个简单的联系人应用程序,但在将数据从数据库检索到对象列表时遇到了一个问题。我试着在没有物体的情况下做这件事,然后我注意到这种方法在实践中更常用。我想在这个应用程序中做的是在列表视图中显示联系人的姓名 这是我的代码: public class Contact { //private variables int _id; String _name; String _phone_number; // Empty constructor public Contact(){ } p

我正在尝试制作一个简单的联系人应用程序,但在将数据从数据库检索到对象列表时遇到了一个问题。我试着在没有物体的情况下做这件事,然后我注意到这种方法在实践中更常用。我想在这个应用程序中做的是在列表视图中显示联系人的姓名

这是我的代码:

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

}
方法来检索所有数据:

 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;
}
公共列表getAllContacts(){ List contactList=new ArrayList(); //选择所有查询 String selectQuery=“SELECT*FROM”+表格\联系人; SQLiteDatabase db=this.getWritableDatabase(); Cursor Cursor=db.rawQuery(selectQuery,null); //循环遍历所有行并添加到列表 if(cursor.moveToFirst()){ 做{ 触点=新触点(); setID(Integer.parseInt(cursor.getString(0)); contact.setName(cursor.getString(1)); contact.setPhoneNumber(cursor.getString(2)); //将联系人添加到列表中 联系人列表。添加(联系人); }while(cursor.moveToNext()); } //返回联系人列表 返回联系人列表; } 在my MainActivity中检索数据的方法(这里有问题,但无法解决):

public void printDatabase(){
List listOfContacts=handler.getAllContacts();
联系方式(cn:listOfContacts){
cn.getName();
新增(cn)合同清单;
}
}
两个问题:

1) 正如@RaviTeja所指出的,所有初始化都在onCreate()方法中进行,而不是在循环中进行。然后,调用notifydatasetchanged()

(二) 引用ArrayAdapter的官方文件:

无论文本视图是如何引用的,它都将填充 数组中每个对象的toString()。您可以添加 自定义对象。将对象的toString()方法重写为 确定将为列表中的项目显示哪些文本

所以,你知道该怎么做。在
Contact
类中实现ToString()方法,如下所示:

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

您不必在循环中初始化listview和适配器

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

将上述代码部分移出for循环。无需循环。将此代码放入
onCreate()
并全局声明适配器。然后调用
adapter.notfiyDataSetChanged()
将联系人添加到列表中后。这将更新列表。

您确定要获取联系人列表中的所有联系人吗?你面临的确切问题是什么?发布您的logcat.contact名称未显示在ListView中,因此我添加了toString方法,如更新的主题中所示。我还将listview部分移到了on create方法,并删除了for循环。那么我的printDatabase方法应该是什么样子呢?因为我经常使用它(在删除联系人、添加联系人等之后),根据您的用例,您的打印数据库应该只更新适配器中的列表,并调用“notifydatasetchanged()”方法。没问题。如果它解决了您的问题,您应该接受答案,以便此页面上的新用户知道该做什么:)
listView = (ListView) findViewById(R.id.listview); //global
ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,listOfContacts);
listView.setAdapter(adapter);