今天主要是对显示用户列表进行操作。
1、对DBHelper里增加获取列表的方法,因此,这里我们就干脆把所有的DBHelper方法全部贴上来,包含了前一篇的该类的内容
增加的这个方法在代码底部,有用注释标注出来
package test.contact.db;
import java.util.ArrayList;
import java.util.HashMap;
import test.contact.entity.User;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
//将DBHelper构造成一个单例模式(1.写成私有 2.)
public final static String DB_NAME = "contact";
public final static int VERSION = 3;//数据库的版本
private static DBHelper instance = null;
private SQLiteDatabase db;//用这个SQLIiteDBHelper主要是为了初始化这个数据库
//单例模式
public static DBHelper getInstance(Context context){
if(instance==null){
instance = new DBHelper(context);
}
return instance;
}
private void openDatabase(){
if(db==null){
db = this.getWritableDatabase();
}
}
private DBHelper(Context context) {
super(context, DB_NAME,null, VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {//在这里把表建立起来,这个方法只执行一次,如果有表了,就不执行这个方法了
// TODO Auto-generated method stub
StringBuffer tableCreate = new StringBuffer();
tableCreate.append("create table user( _id integer primary key autoincrement,")
.append("name text,")
.append("mobilePhone text,")
.append("familyPhone text,")
.append("officePhone text,")
.append("address text,")
.append("position text, ")
.append("company text,")
.append("email text,")
.append("otherContact text ,")
.append("zipCode text,")
.append("remark text,")
.append("imageId int)");
db.execSQL(tableCreate.toString());
}
//如果数据库版本不一致才执行,一般做法是:清除数据库然后重新建表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
String sql = "drop table if exists user";
db.execSQL(sql);
onCreate(db);
}
//保存,把user当作一个对象,将增加联系人的信息都存到这里来
public void save(User user){
openDatabase();//每次增加记录的时候,open一下
ContentValues value = new ContentValues();
value.put("name", user.name);
value.put("mobilePhone", user.mobilePhone);
value.put("familyPhone", user.familyPhone);
value.put("officePhone", user.officePhone);
value.put("address", user.address);
value.put("position", user.position);
value.put("company", user.company);
value.put("email", user.email);
value.put("otherContact", user.otherContact);
value.put("zipCode", user.zipCode);
value.put("remark", user.remark);
value.put("imageId", user.imageId);
db.insert("user", null, value);
}
//获得数据放在用户列表中
public ArrayList getUserList(){
openDatabase();
Cursor cursor = db.query("user", null, null, null, null, null, null);//查询表的一些条件
ArrayList list = new ArrayList();
while(cursor.moveToNext()){
HashMap map = new HashMap();
map.put("imageId",cursor.getInt(cursor.getColumnIndex("imageId")));
map.put("name", cursor.getString(cursor.getColumnIndex("name")));
map.put("mobilePhone", cursor.getString(cursor.getColumnIndex("mobilePhone")));
list.add(map);
}
return list;
}
}
2、在MainACtivity.java里,要显示该列表,通过Adapter来链接DBHelper中的获取列表方法和界面,显示出来,只是增添了一些加载该界面(用户列表)的方法,也包含了前一篇中的该类的内容。具体的加载方法在里面有注释,另外,这个界面是用xml来表示,在3中会有。
package test.contact;
import java.util.ArrayList;
import java.util.HashMap;
import test.contact.db.DBHelper;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
GridView gv_button_menu;
ListView lv_userList;//用户列表
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
loadUserList();
}
private void loadUserList(){
lv_userList = (ListView)this.findViewById(R.id.lv_userlist);
ArrayList data = DBHelper.getInstance(this).getUserList();//这个方法在DBHelper里
SimpleAdapter adapter = new SimpleAdapter(this,
data, R.layout.list_item,
new String[]{"imageId","name","mobilePhone"},
new int[]{R.id.user_image,R.id.tv_showname,R.id.tv_showmobilephone});
lv_userList.setAdapter(adapter);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_MENU){
//
if(gv_button_menu==null){
loadButtonMenu();
}
if(gv_button_menu.getVisibility()==View.GONE){
gv_button_menu.setVisibility(View.VISIBLE);
} else {
gv_button_menu.setVisibility(View.GONE);
}
}
return super.onKeyDown(keyCode, event);
}
//加载底部的菜单(gridView)
@SuppressWarnings("unchecked")
private void loadButtonMenu(){
gv_button_menu =(GridView) this.findViewById(R.id.gv_button_menu);
gv_button_menu.setBackgroundResource(R.drawable.menu_background);
gv_button_menu.setNumColumns(5);//设置有多少列
gv_button_menu.setGravity(Gravity.CENTER);//设置位置 居中
gv_button_menu.setVerticalSpacing(100);//设置水平间隔
gv_button_menu.setHorizontalSpacing(10);//设置垂直间隔
ArrayList data = new ArrayList();
//是gridview里的图片和底部的字 ,这些是构造data
HashMap map = new HashMap();
map.put("itemImage", R.drawable.menu_new);
map.put("itemText", "增加");
data.add(map);
map = new HashMap();
map.put("itemImage", R.drawable.menu_search);
map.put("itemText", "查找");
data.add(map);
map = new HashMap();
map.put("itemImage", R.drawable.menu_delete);
map.put("itemText", "删除");
data.add(map);
map = new HashMap();
map.put("itemImage", R.drawable.controlbar_showtype_list);
map.put("itemText", "菜单");
data.add(map);
map = new HashMap();
map.put("itemImage", R.drawable.menu_exit);
map.put("itemText", "退出");
data.add(map);
//创建Adapter
SimpleAdapter adapter =
new SimpleAdapter(this,data, R.layout.item_menu,new String[]{"itemImage","itemText"},new int[]{R.id.item_image,R.id.item_text});
//SimpleAdapter的参数有(context,listmapdata,resource,from,to),其中resource是布局,即item_menu.xml
//data中的map都将布局(resources)通过后面对应的两个联系起来
gv_button_menu.setAdapter(adapter);
//gridview只能展示,是个视图,而适配器就是将数据和展现方式联系起来的方式
}
}
3、要显示的这个列表界面
即显示用户列表的那个界面,这个界面由相对布局组成,然后嵌套了线性布局(水平的),左边是一个ImageViwe,右边是一个LinerLayout(里面签到了两个TextView,一个显示名字,一个显示号码,命名为:list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/user_image"
android:layout_width="50px"
android:layout_height="50px"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
></ImageView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50px"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/user_image"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="25px"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_showname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="姓名:"
android:textSize="17sp"
android:gravity="top"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="7"
android:textSize="17sp"
android:gravity="left"
></TextView>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="25px"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tv_showmobilephone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="手机:"
android:textSize="17sp"
android:gravity="top"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="7"
android:textSize="17sp"
android:gravity="left"
></TextView>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
运行后的结果如下图:
PS:图片的id会变化,所以显示的可能有问题,另外,名字和号码的TextView没有显示提示词,查看了下程序没问题才对,未知问题~
未完待续。。。。下次是跳转页面了。。。