在闲暇之余,自己整理一些代码,开发这个通讯录。
1.adapter中包含phone和user两个适配器,主要是接收数据给Listview去使用。
2.bean文件中定义phoneNumber和UserBean.这两个定义的目的是为了数据库中使用的表。从代码中能够看出tableName。
3.MyDilog是自定义对话框
4.sql文件夹下有phoneDao和UserDao,用于对两张表的数据操作。sqlhelper是orm数据库初始化使用。
5.util是工具类,一个是生成汉字,一个生成拼音的。
6.view中的CircleImageView是自定义头像view。
7.页面为两个activity。一个是MainActivity和DetailActivity。两个页面采用最新语言kotlin语言进行开发。
8.在MainActivity中onCreate为入口方法。
sqlHelper = SqlHelper.getInstance(this)
userDao = UserDao(this)
phoneDao = PhoneDao(this)
characterParser = CharacterParser() 初始化数据库
handler = object : Handler() {
override fun handleMessage(msg: Message) {
if (msg.what == 10010) {
refreshUi()
}
}
}更新UI
editText = findViewById(R.id.editText)
imageView = findViewById(R.id.imageView)
listView = findViewById(R.id.list_view)
textView11 = findViewById(R.id.textView11)
textView12 = findViewById(R.id.textView12)
imageView5 = findViewById(R.id.imageView5)
linearLayout = findViewById(R.id.linearLayout2)
scrollView = findViewById(R.id.scrollView)
toolbar = findViewById(R.id.toolbar)
textView14 = findViewById(R.id.textView14)
toolbar!!.title = "通讯录"
toolbar!!.setTitleTextColor(resources.getColor(R.color.dimgrey))
初始化控件
listView!!.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
//todo 跳转详情页
val userAdpater2 = parent.adapter as UserAdpater
val userBean = userAdpater2.getItem(position)
val editor = sharedPreferences.edit()
editor.putInt("userId", userBean.id)
.apply()
val intent = Intent(this@MainActivity, DetailsActivity::class.java)
intent.putExtra("UserBean", userBean)
startActivity(intent)
finish()
}点击listview中的某一项进入详情页面
listView!!.onItemLongClickListener = AdapterView.OnItemLongClickListener { parent, view, position, id ->
val popupMenu = PopupMenu(this@MainActivity, view)
popupMenu.menuInflater.inflate(R.menu.popu_menu, popupMenu.menu)
popupMenu.setOnMenuItemClickListener {
//todo 删除操作
val userAdpater1 = parent.adapter as UserAdpater
val userBean = userAdpater1.getItem(position)
userDao!!.delete(userBean)
notification(userBean.name)
refreshUi()
false
}
popupMenu.show()
true
}长按进行删除
override fun onMenuItemClick(menuItem: MenuItem): Boolean {
when (menuItem.itemId) {
R.id.menu_add -> {
//todo 添加联系人
val myDilog = MyDilog(this@MainActivity)
myDilog.setDialogCallBack { userBean ->
val i = userDao!!.insert(userBean)
if (i != -1) {
// Toast.makeText(MainActivity.this, "插入成功" + i, Toast.LENGTH_SHORT).show();
runOnUiThread { refreshUi() }
}
}
myDilog.show()
val mWindow = myDilog.window
mWindow!!.setGravity(Gravity.CENTER)
}
R.id.menu_about -> {
//todo 关于
val builder = AlertDialog.Builder(this)
builder.setTitle("关于")
.setMessage("本次课程设计")
builder.show()
}
R.id.mene_grop -> if (menuItem.title == "分组查看") {
flag = true
editText!!.hint = "输入查询分组名"
menuItem.title = "取消分组查看"
val beanList = userDao!!.qurreyAll()
list2 = sort1(beanList)
userAdpater2 = UserAdpater(this, list2, 1)
listView!!.adapter = userAdpater2
} else {
flag = false
menuItem.title = "分组查看"
editText!!.hint = "请输入查询联系人的姓名"
userAdpater!!.notifyDataSetChanged()
listView!!.adapter = userAdpater
}
R.id.menu_addData -> {
val myThread = MyThread()
myThread.start()
}
}
return false
}右上角菜单功能
internal fun notification(name: String) { 通知栏提示
val name1 = "my_package_channel"//渠道名字
val id = "my_package_channel_1" // 渠道ID
val description = "my_package_first_channel" // 渠道解释说明
val pendingIntent: PendingIntent//非紧急意图,可设置可不设置
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//判断是否是8.0上设备
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val importance = NotificationManager.IMPORTANCE_LOW
var mChannel: NotificationChannel? = null
if (mChannel == null) {
mChannel = NotificationChannel(id, name1, importance)
mChannel.description = description
mChannel.enableLights(true) //是否在桌面icon右上角展示小红点
notificationManager!!.createNotificationChannel(mChannel)
}
notificationBuilder = Notification.Builder(this)
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
notificationBuilder!!
.setSmallIcon(R.drawable.small)
.setContentTitle("通讯录提示")
.setContentText("$name\t删除成功")
.setContentIntent(pendingIntent)
.setChannelId(id)
.setAutoCancel(true)
} else {
notificationBuilder = Notification.Builder(this)
.setSmallIcon(R.drawable.small)
.setContentTitle("通讯录提示")
.setContentText("$name\t删除成功")
.setAutoCancel(true)
}
notificationManager!!.notify(0, notificationBuilder!!.build())
}删除成功后在通知栏显示
9.DetailsActivity
private var name: EditText? = null private var email: EditText? = null private var school: EditText? = null private var sex: Spinner? = null private var group: Spinner? = null private var listView: ListView? = null private var toolbar: Toolbar? = null private var list: MutableList<PhoneNumber>? = null private val newList: List<PhoneNumber>? = null private var userBean: UserBean? = null private var userDao: UserDao? = null private var phoneDao: PhoneDao? = null private val phoneNumber: PhoneNumber? = null private var phoneSpinner: Spinner? = null private var phoneEd: EditText? = null private var phoneImg: ImageView? = null private var phoneAdapter: PhoneAdapter? = null private val map1 = HashMap<Int, EditText>() private val map2 = HashMap<Int, Spinner>()
声明变量
userDao = UserDao(this) 初始化user数据类型 phoneDao = PhoneDao(this) 初始化phone数据类型 name = findViewById(R.id.editText3) email = findViewById(R.id.editText4) school = findViewById(R.id.editText5) sex = findViewById(R.id.spinner) group = findViewById(R.id.spinner2) listView = findViewById(R.id.details_listview) phoneSpinner = findViewById(R.id.details_spinner) phoneEd = findViewById(R.id.details_number) phoneImg = findViewById(R.id.details_img) toolbar = findViewById(R.id.toolbar2)
list = phoneDao.queryByUserId(userBean!!.id) phoneAdapter = PhoneAdapter(this, list, map1, map2) listView!!.adapter = phoneAdapter
得到list数据,然后赋值给adapter,将adapter赋值给listview。
phoneEd!!.setOnLongClickListener { call(phoneEd!!.text.toString()) // doSendSMSTo(phoneEd!!.text.toString()) }
加入长按打电话功能,注释掉的是发送短信功能