Question

I want to format the text from db, that I fill to a listview. In the log, the text has the right format, but on the device the text is something like

packagename.class@52aad49c 

Log text:

05-09 16:06:02.146: D/Name:(1750): Id: 1 ,Name: Ravi ,Phone: 9100000000
05-09 16:06:02.146: D/Name:(1750): Id: 2 ,Name: Srinivas ,Phone: 9199999999
05-09 16:06:02.146: D/Name:(1750): Id: 3 ,Name: Tommy ,Phone: 9522222222
05-09 16:06:02.146: D/Name:(1750): Id: 4 ,Name: Karthik ,Phone: 9533333333
05-09 16:06:02.146: D/Name:(1750): Id: 5 ,Name: Ravi ,Phone: 9100000000

That's the code to write to DB and fill the listview:

//DB
           DatabaseHandler db = new DatabaseHandler(this);

            /**
             * CRUD Operations
             * */
            // Inserting Contacts
            Log.d("Insert: ", "Inserting .."); 
            db.addContact(new Contact("Ravi", "9100000000"));        
            db.addContact(new Contact("Srinivas", "9199999999"));
            db.addContact(new Contact("Tommy", "9522222222"));
            db.addContact(new Contact("Karthik", "9533333333"));

            // Reading all contacts
            Log.d("Reading: ", "Reading all contacts.."); 
            List<Contact> contacts = db.getAllContacts();       

            for (Contact cn : contacts) {
                String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
                    // Writing Contacts to log
            Log.d("Name: ", log);

            //fill listview
            ArrayAdapter<Contact> adapterVerlauf = new ArrayAdapter<Contact>(Ende.this, android.R.layout.simple_list_item_1, contacts);
            ListView Verlauf = (ListView) findViewById(R.id.listview);
            Verlauf.setAdapter(adapterVerlauf);

My database-handler:

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "contactsManager";

    // Contacts table name
    private static final String TABLE_CONTACTS = "contacts";

    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        // Create tables again
        onCreate(db);
    }

    /**
     * All CRUD(Create, Read, Update, Delete) Operations
     */

    // Adding new contact
    void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone

        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }

    // Getting single contact
    Contact getContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();

        Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));
        // return contact
        return contact;
    }

    // Getting All Contacts
    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;
    }

    // Updating single contact
    public int updateContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName());
        values.put(KEY_PH_NO, contact.getPhoneNumber());

        // updating row
        return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
    }

    // Deleting single contact
    public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
        db.close();
    }


    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }

}
Was it helpful?

Solution 2

What is missing from your code is the mapping from the Contact objects to the views inside the ListView. The most basic solution I can think of right now would look something like this:

public class ContactAdapter extends BaseAdapter {

    private final List<Contact> contactList;
    private final LayoutInflater layoutInflater;

    public ContactAdapter(Context context, List<Contact> contactList) {
        this.layoutInflater = LayoutInflater.from(context);
        this.contactList = contactList;
    }

    @Override
    public int getCount() {
        return this.contactList.size();
    }

    @Override
    public Contact getItem(int position) {
        return this.contactList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // You get the Contact object for the current position
        Contact contact = getItem(position);

        // If the convertView is null we need to create a new one.            
        if(convertView == null) {
            convertView = this.layoutInflater.inflate(R.layout.list_item, parent, false);

            // We pass the view to our ViewHolder and set the ViewHolder as tag to the View
            ContactViewHolder holder = new ContactViewHolder(convertView);
            convertView.setTag(holder);
        }

        // We get the ViewHolder from the tag and bind the Contact object to it.
        ContactViewHolder holder = (ContactViewHolder) convertView.getTag();
        holder.bind(contact);

        return convertView;
    }

    private class ContactViewHolder {
        private final TextView tvName;
        private final TextView tvTelephone;

        public ContactViewHolder(View convertView) {

            // We get the TextViews from the convertView
            this.tvName = (TextView) convertView.findViewById(R.id.tvName);
            this.tvTelephone = (TextView) convertView.findViewById(R.id.tvTelephone);
        }

        public void bind(Contact contact) {
            // We set the values of our TextViews according to the Contact object.
            this.tvName.setText(contact.getName());
            this.tvTelephone.setText(contact.getTelephoneNumber());
        }
    }
}

This is a simple adapter which uses the ViewHolder pattern for increased scroll performance. It should all be very self explanatory, nevertheless if you have questions feel free to ask. Here is the layout R.layout.list_item which I used for testing, it just contains the two TextViews tvName and tvTelephone in a RelativeLayout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

    <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    <TextView
            android:id="@+id/tvTelephone"
            android:layout_below="@id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

</RelativeLayout>

OTHER TIPS

You can override the toString method of your Contact class:

@Override
public String toString() {
    return "Id: " + getID() + " ,Name: " + getName() + " ,Phone: " + getPhoneNumber();
}

Straight from the docs:

Override the toString() method of your objects to determine what text will be displayed for the item in the list.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top