android: 模拟实现 联系人
前边包含一个头像图标,右侧是姓名 电话 既简单介绍,点击下方 添加联系人 添加,单击item显示电话 长按显示 编辑和 删除,删除之前有 提示是否删除
如图
Mainactivity 的布局 listView 权重为1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/gview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</ListView>
<Button
android:id="@+id/add_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="添加新的联系人" />
</LinearLayout>
listview布局格式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/gview_img"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:orientation="vertical"
android:layout_margin="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:id="@+id/gview_name"
android:text=""
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:id="@+id/gview_num"
android:text=""
/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_gravity="center"
android:id="@+id/gview_msg"
android:text=""
/>
</LinearLayout>
添加 联系人的 对话框 的 格式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/contact_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:hint="姓名" />
<EditText
android:id="@+id/contact_num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:hint="联系方式"
android:inputType="number"
android:maxLength="11" />
<EditText
android:id="@+id/contact_msg"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_margin="4dp"
android:hint="详细信息" />
<Button
android:id="@+id/contact_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
/>
</LinearLayout>
Java代码部分
1.定义联系人的 属性
package com.example.contacttest;
import android.R.string;
/**
* 定义联系人的一些属性 姓名电话 和简介 并封装
* @author Administrator
*
*/
public class Userinfo {
private String nameString;
private String num;
private String msgString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String getNum() {
return num;
}
public void setNum(String string) {
this.num = string;
}
public String getMsgString() {
return msgString;
}
public void setMsgString(String msgString) {
this.msgString = msgString;
}
}
2.定义数据库的辅助类
package com.example.contacttest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 数据库的辅助类
*
* @author Administrator
*
*/
public class Dbhelper extends SQLiteOpenHelper {
// 数据库名字定义为为常量
public final static String DB_NAME = "contact.db";
// 数据库的版本号
public final static int DB_VERSION = 1;
// 表名
public final static String TABLE_NAME = "contacts";
// 定义单参的构造方法方便调用
public Dbhelper(Context context) {
// Context context, String name, CursorFactory factory, int version
// factory输入null,使用默认值
super(context, DB_NAME, null, DB_VERSION);// 引入父类的构造方法不需要工厂。,
}
// 初次创建时 调用
@Override
public void onCreate(SQLiteDatabase db) {
// 创建表的操作
db.execSQL("CREATE TABLE contacts(name vachar,num vachar,msg vachar)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
}
3.定义数据库的 操作管理
package com.example.contacttest;
import java.util.ArrayList;
import java.util.List;
import android.R.integer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* 业务操作 增删改查
*
* @author Administrator
*
*/
public class ContactManage {
private Dbhelper mDbhelper;
public final static String TABLE_NAME = "contacts";
public final static String NAME = "name";
public final static String NUM = "num";
public final static String MSG = "msg";
public ContactManage(Context context) {
// 单参的 构造方法 传入上下文对象
mDbhelper = new Dbhelper(context);
}
// 插入数据 传参
public Boolean insert(Userinfo infUserinfo) {
// 打开数据库 返回数据库对象
SQLiteDatabase db = mDbhelper.getWritableDatabase();
// 操作便于操作 定义表名和 列明 为常量 需要定义ContentValues 字段和值对应
ContentValues cxValues = new ContentValues();
cxValues.put(NAME, infUserinfo.getNameString());
cxValues.put(NUM, infUserinfo.getNum());
cxValues.put(MSG, infUserinfo.getMsgString());
long a=db.insert(TABLE_NAME, null, cxValues);
db.close();
// 关闭
if (a!=0) {
return true;
}
else return false;
}
// 删除
public void delete(Userinfo infUserinfo) {
// 打开数据库 返回数据库对象
SQLiteDatabase db = mDbhelper.getWritableDatabase();
// 删除 table, whereClause, whereArgs
// 删除 table, whereClause, whereArgs 因为 可以是复合语句所以最后一个需要string【】 来存放多个字段
db.delete(TABLE_NAME, "NAME=?",
new String[] { infUserinfo.getNameString() });
db.close();
// 关闭
}
public void update(Userinfo infUserinfo) {
// 打开数据库 返回数据库对象
SQLiteDatabase db = mDbhelper.getWritableDatabase();
ContentValues cxValues = new ContentValues();
cxValues.put(NAME, infUserinfo.getNameString());
cxValues.put(NUM, infUserinfo.getNum());
cxValues.put(MSG, infUserinfo.getMsgString());
// db.update(table, values, whereClause, whereArgs) 表名 值 后边两个 是判断条件 返回操作成功条数 ==1 判断??
db.update(TABLE_NAME, cxValues, "NAME=?", new String[] { infUserinfo.getNameString() });
db.close();
// 关闭
}
/**
* 查询
*/
public List<Userinfo> getAll() {
List<Userinfo> infList = new ArrayList<Userinfo>();
SQLiteDatabase db = mDbhelper.getWritableDatabase();
// 查询
// db.query(table, columns, selection, selectionArgs, groupBy, having,
// orderBy)
Cursor cursor = db
.query(TABLE_NAME, null, null, null, null, null, null);
while (cursor.moveToNext()) {
// 获得数据的方法getXXX 参数为 列的索引(下标) 由列表获得索引
String nameString = cursor.getString(cursor.getColumnIndex(NAME));
String numString = cursor.getString(cursor.getColumnIndex(NUM));
String msgString = cursor.getString(cursor.getColumnIndex(MSG));
// 保存数据
Userinfo iUserinfo = new Userinfo();
iUserinfo.setMsgString(msgString);
iUserinfo.setNameString(nameString);
iUserinfo.setNum(numString);
infList.add(iUserinfo);
}
db.close();
return infList;
}
}
最后是 MainActivity对应的Java文件
package com.example.contacttest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView gview;
private Button add_btn;
private List<Userinfo> dataList;
private Myadpter aMyadpter = new Myadpter();
private ContactManage cManage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gview = (ListView) findViewById(R.id.gview);
gview.setBackgroundResource(R.drawable.bgg);
cManage = new ContactManage(getApplicationContext());
// 获得 数据源list
dataList = cManage.getAll();
add_btn = (Button) findViewById(R.id.add_btn);
add_btn.setOnClickListener(mListener);
gview.setAdapter(aMyadpter);
/**
* 长按事件
*/
gview.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
final int a = position;
AlertDialog.Builder edit1 = new AlertDialog.Builder(
MainActivity.this);
edit1.setTitle("编辑联系人");
edit1.setItems(new String[] { "删除", "编辑" },
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
switch (which) {
case 0:
AlertDialog.Builder edit3 = new AlertDialog.Builder(
MainActivity.this);
edit3.setTitle("删除联系人");
edit3.setMessage("确定呀删除么?");
edit3.setPositiveButton(
"删除",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
cManage.delete(dataList
.get(a));
// 此处需要更新适配器
dataList = cManage.getAll();
aMyadpter.notifyDataSetChanged();
}
});
edit3.setNeutralButton("取消", null);
edit3.create().show();
break;
case 1:
AlertDialog.Builder addcontact = new AlertDialog.Builder(
MainActivity.this);
addcontact.setTitle("编辑联系人");
View rooyview = getLayoutInflater()
.inflate(R.layout.addcontacter,
null);
final EditText contact_name = (EditText) rooyview
.findViewById(R.id.contact_name);
final EditText contact_num = (EditText) rooyview
.findViewById(R.id.contact_num);
final EditText contact_msg = (EditText) rooyview
.findViewById(R.id.contact_msg);
final Button contact_save = (Button) rooyview
.findViewById(R.id.contact_save);
contact_save.setVisibility(View.GONE);
contact_name.setText(dataList.get(a)
.getNameString());
contact_num.setText(dataList.get(a)
.getNum());
contact_msg.setText(dataList.get(a)
.getMsgString());
addcontact.setView(rooyview);
addcontact.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
String name = contact_name.getText().toString().trim();
String num = contact_num<span style="font-family: Arial, Helvetica, sans-serif;">.</span>.getText().toString().trim();
String msg = contact_msg.getText().toString().trim();
Userinfo user = new Userinfo();
user.setMsgString(msg);
user.setNameString(name);
user.setNum(num);
cManage.update(user);// 此处需要更新适配器
dataList = cManage.getAll();
aMyadpter.notifyDataSetChanged();
}
});
addcontact.setNegativeButton("取消", null);
addcontact.create().show();
break;
default:
break;
}
}
});
edit1.create().show();
return true;
}
});
/**
* 点击事件
*/
gview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
AlertDialog.Builder edit2 = new AlertDialog.Builder(
MainActivity.this);
edit2.setMessage(dataList.get(position).getNum());
edit2.create().show();
}
});
}
class Myadpter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Haderset hset;
if (!dataList.isEmpty()) {
gview.setBackgroundColor(Color.WHITE);
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.gview,
null);
hset = new Haderset();
hset.itemimg = (ImageView) convertView
.findViewById(R.id.gview_img);
hset.itemname = (TextView) convertView
.findViewById(R.id.gview_name);
hset.itemnum = (TextView) convertView
.findViewById(R.id.gview_num);
hset.itemmsg = (TextView) convertView
.findViewById(R.id.gview_msg);
convertView.setTag(hset);
} else {
hset = (Haderset) convertView.getTag();
}
hset.itemimg.setImageResource(R.drawable.ic_launcher);
hset.itemname.setText(dataList.get(position).getNameString());
hset.itemnum.setText(dataList.get(position).getNum());
hset.itemmsg.setText(dataList.get(position).getMsgString());
return convertView;
//
} else {
return null;
}
}
class Haderset {
ImageView itemimg;
TextView itemname;
TextView itemnum;
TextView itemmsg;
}
}
/**
* //添加 联系人
*/
private OnClickListener mListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_btn:
final AlertDialog.Builder addcontact = new AlertDialog.Builder(
MainActivity.this);
addcontact.setTitle("添加联系人");
View rooyview = getLayoutInflater().inflate(
R.layout.addcontacter, null);
final EditText contact_name = (EditText) rooyview
.findViewById(R.id.contact_name);
final EditText contact_num = (EditText) rooyview
.findViewById(R.id.contact_num);
final EditText contact_msg = (EditText) rooyview
.findViewById(R.id.contact_msg);
Button contact_save = (Button) rooyview
.findViewById(R.id.contact_save);
addcontact.setView(rooyview);
final AlertDialog dialog = addcontact.create();
dialog.show();
contact_save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = contact_name.getText().toString().trim();
String num = contact_num.getText().toString().trim();
String msg = contact_msg.getText().toString().trim();
Userinfo iUserinfo = new Userinfo();
iUserinfo.setMsgString(msg);
iUserinfo.setNameString(name);
iUserinfo.setNum(num);
if (cManage.insert(iUserinfo)) {
Toast.makeText(getApplicationContext(), "保存成功",
Toast.LENGTH_SHORT).show();
AlertDialog.Builder dia = new AlertDialog.Builder(
MainActivity.this);
dia.setTitle("是否继续添加");
dia.setMessage("已成功保存,是否继续?");
dia.setPositiveButton("是",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
contact_name.setText("");
contact_num.setText("");
contact_msg.setText("");
contact_name.requestFocus();// 获取焦点
// 此处需要更新适配器 重新取值
dataList = cManage.getAll();
aMyadpter.notifyDataSetChanged();
}
});
dia.setNegativeButton("否",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface _dialog,
int which) {
// 更新变量尽量不要 和系统的一致
// 造成默认为dialog,修改为_dialog
// 默认参数替代了定义的 变量
dataList = cManage.getAll();
aMyadpter.notifyDataSetChanged();
dialog.dismiss();
}
});
dia.create().show();
} else
Toast.makeText(getApplicationContext(), "失败鸟!",
Toast.LENGTH_SHORT).show();
}
});
break;
default:
break;
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}