Reputation: 43
I am working on a contact book like application.I have a database and,I want to display the data in ListView. Can anybody tell me how to achieve this? Below is what I have tried so far,
public class Contacts {
private int id;
private String name;
private String phone_number;
private String email;
public Contacts()
{
}
public Contacts(int id, String name, String phone_number, String email)
{
this.id = id;
this.name = name;
this.phone_number = phone_number;
this.email = email;
}
public Contacts(String name, String phone_number, String email)
{
this.name = name;
this.phone_number = phone_number;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone_number() {
return phone_number;
}
public void setPhone_number(String phone_number) {
this.phone_number = phone_number;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "ContactsManager";
private static final String TABLE_CONTACTS = "contacts";
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_PH_NO = "phone_number";
private static final String KEY_EMAIL = "email";
public DatabaseHandler(Context context) {
super( context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT," + KEY_EMAIL + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
onCreate(db);
}
public void insertContact(Contacts contacts)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, contacts.getName()); // Contact Name
cv.put(KEY_PH_NO, contacts.getPhone_number()); // Contact Phone
cv.put(KEY_EMAIL, contacts.getEmail()); //Contact Email
// Inserting Row
db.insert(TABLE_CONTACTS, null, cv);
db.close();
}
// Getting All Contacts
public List<Contacts> getAllContacts()
{
List<Contacts> contactList = new ArrayList<Contacts>();
// 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 {
Contacts contact = new Contacts();
//contact.setId(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setPhone_number(cursor.getString(2));
contact.setEmail(cursor.getString(3));
// Adding contact to list
contactList.add(contact);
}
while (cursor.moveToNext());
}
// return contact list
return contactList;
}
}
public class View_data extends ListActivity {
DatabaseHandler db = new DatabaseHandler(this);
Cursor c ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_data);
db.getWritableDatabase();
List<Contacts> values = db.getAllContacts();
ArrayAdapter<Contacts> adapter = new ArrayAdapter<Contacts>(this,
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.view_data, menu);
return true;
}
}
In View_data
class i tried to display the data but couldn't do it.
Any Suggestion will be highly appreciated.
Upvotes: 3
Views: 45842
Reputation: 1319
You have to pass the data to the UserAdapter.The code
List<DataProvider> data = userDbHelper.getInformation(sqLiteDatabase);
is used to retrive data from SQL database which are applied to the variable data. Try this method.
List<DataProvider> data = userDbHelper.getInformation(sqLiteDatabase);
UsersAdapter adapter = new UsersAdapter(this, (ArrayList<DataProvider>) data);
list.setAdapter(adapter);
Then UserAdapter class implentation is given below which extends the ArrayAdapter..
public class UsersAdapter extends ArrayAdapter<DataProvider> {
private static class ViewHolder {
TextView id;
TextView name;
TextView number;
}
public UsersAdapter(Context context, ArrayList<DataProvider> users) {
super(context, R.layout.new_layout, users);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
// User user = getItem(position);
DataProvider dataProvider = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
// If there's no view to re-use, inflate a brand new view for row
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.new_layout, parent, false);
viewHolder.id = (TextView)convertView.findViewById(R.id.textId);
viewHolder.name = (TextView) convertView.findViewById(R.id.textname);
viewHolder.number = (TextView) convertView.findViewById(R.id.textnumber);
// Cache the viewHolder object inside the fresh view
convertView.setTag(viewHolder);
} else {
// View is being recycled, retrieve the viewHolder object from tag
viewHolder = (ViewHolder) convertView.getTag();
}
// Populate the data from the data object via the viewHolder object
// into the template view.
viewHolder.id.setText(dataProvider.getId());
viewHolder.name.setText(dataProvider.getName());
viewHolder.number.setText(dataProvider.getMob());
// Return the completed view to render on screen
return convertView;
}
}
The above code is UserAdapter which extends the ArrayAdapter.Try this method you will get the solution. You can also refer this link https://github.com/codepath/android_guides/wiki/using-an-arrayadapter-with-listview
Upvotes: 0
Reputation: 3745
You have to pass the context ,your list item layout and cursor in the Custom adapter.........
final CustomAdapter adapter = new CustomAdapter(MainActivity.this,
R.layout.listitem, cursor);
list.setAdapter(adapter);
then this is how CustomAdapter class is implemented in which you have to override your bindView method. This will look complex until you study it and then try to do it yourself.
public class CustomAdapter extends CursorAdapter {
// Cursor cursor;
Context context;
public CustomAdapter(Context context, int RId, Cursor cursor) {
super(context, cursor);
// this.cursor = cursor;
this.context = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView team1 = (TextView) view.findViewById(R.id.listitem_team1);
team1.setText(cursor.getString(10));
TextView team2 = (TextView) view.findViewById(R.id.listitem_team2);
team2.setText(cursor.getString(11));
TextView date = (TextView) view.findViewById(R.id.listitem_date);
date.setText(cursor.getString(3));
TextView city = (TextView) view.findViewById(R.id.listitem_city);
city.setText(cursor.getString(2));
TextView time = (TextView) view.findViewById(R.id.listitem_time);
time.setText(cursor.getString(4));
TextView ground = (TextView) view.findViewById(R.id.listitem_ground);
date.setText(cursor.getString(1));}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.listitem, parent, false);
return v;
}
}
you can also refer to this link http://dj-android.blogspot.in/2012/10/android-show-data-from-sqlite-db-into.html
Upvotes: 5