目录
一、项目演示
网络资源模板--通讯录App
二、项目测试环境
三、项目详情
首页
package com.example.addressbook.activity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.addressbook.R;
import com.example.addressbook.adapter.ContactAdapter;
import com.example.addressbook.bean.ContactBean;
import com.example.addressbook.db.DBManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private boolean keyPress = true; // 用于控制返回键双击退出提示
private ContactAdapter mAdapter; // 联系人适配器
private List<ContactBean> mContactList = new ArrayList<>(); // 联系人列表
private DBManager mDBManager; // 数据库管理器
private RecyclerView recyclerView; // RecyclerView
private List<String> requestPermissions; // 请求的权限列表
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 设置布局
checkPermission(); // 检查权限
initView(); // 初始化视图
initRecyclerView(); // 初始化 RecyclerView
mDBManager = new DBManager(this); // 初始化数据库管理器
getContactList(); // 获取联系人列表
}
// 初始化视图组件
private void initView() {
recyclerView = findViewById(R.id.recycler_view); // 获取 RecyclerView
findViewById(R.id.btn_add).setOnClickListener(v ->
startActivityForResult(new Intent(this, AddContactActivity.class), REQUEST_CODE)); // 添加按钮点击事件
// 姓名输入框的文本改变监听
((EditText) findViewById(R.id.edit_name)).addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
updateContactList(charSequence.toString()); // 更新联系人列表
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
// 初始化 RecyclerView
private void initRecyclerView() {
mAdapter = new ContactAdapter(this, mContactList, new ContactAdapter.OnClickContactListener() {
@Override
public void onClickListener(int position) {
Intent intent = new Intent(MainActivity.this, EditContactActivity.class);
intent.putExtra("contact", (Parcelable) mContactList.get(position)); // 传递联系人数据
startActivityForResult(intent, REQUEST_CODE); // 启动编辑联系人活动
}
@Override
public boolean onLongClickListener(int position) {
showDeleteDialog(position, mContactList.get(position).getContactId()); // 显示删除对话框
return true;
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置布局管理器
recyclerView.setAdapter(mAdapter); // 设置适配器
}
// 更新联系人列表
private void updateContactList(String query) {
List<ContactBean> contactBeanList = mDBManager.selectContactByName(query); // 根据姓名查询联系人
mContactList.clear(); // 清空联系人列表
if (contactBeanList != null) {
mContactList.addAll(contactBeanList); // 添加查询结果
}
Collections.sort(mContactList); // 排序联系人列表
mAdapter.notifyDataSetChanged(); // 通知适配器数据已更改
}
// 获取联系人列表
private void getContactList() {
mContactList.clear(); // 清空联系人列表
mContactList.addAll(mDBManager.selectContactList()); // 从数据库获取所有联系人
Collections.sort(mContactList); // 排序联系人列表
mAdapter.notifyDataSetChanged(); // 通知适配器数据已更改
}
// 显示删除确认对话框
private void showDeleteDialog(final int position, final int contactId) {
View view = LayoutInflater.from(this).inflate(R.layout.dialog_delete_contact, null, false);
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setView(view)
.create();
alertDialog.show();
alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); // 设置背景透明
// 确认删除按钮
view.findViewById(R.id.btn_confirm).setOnClickListener(v -> {
mDBManager.deleteContact(contactId); // 从数据库中删除联系人
mContactList.remove(position); // 从联系人列表中移除
mAdapter.notifyItemRemoved(position); // 通知适配器移除某项
mAdapter.notifyItemRangeChanged(position, mContactList.size() - position); // 更新后续项
alertDialog.dismiss(); // 关闭对话框
});
// 取消按钮
view.findViewById(R.id.btn_cancel).setOnClickListener(v -> alertDialog.dismiss());
}
// 处理活动结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
getContactList(); // 更新联系人列表
}
}
// 处理物理返回键事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (keyPress) {
Toast.makeText(this, "再按一次返回键退出通讯录", Toast.LENGTH_SHORT).show(); // 提示用户再次按返回键
keyPress = false;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
keyPress = true; // 2秒后重置按键状态
}
}, 2000);
} else {
finish(); // 结束当前活动
}
return true;
}
return super.onKeyDown(keyCode, event);
}
// 检查权限
private boolean checkPermission() {
requestPermissions = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
requestPermissions.add(permission); // 添加未授权的权限
}
}
return requestPermissions.isEmpty(); // 返回是否所有权限均已授权
}
}
-
联系人列表管理:
- 使用
RecyclerView
显示联系人列表。 - 通过
DBManager
从数据库中加载和管理联系人数据。
- 使用
-
添加和编辑联系人:
- 提供按钮以启动添加联系人页面 (
AddContactActivity
)。 - 点击联系人条目可以编辑该联系人,启动
EditContactActivity
。
- 提供按钮以启动添加联系人页面 (
-
搜索联系人:
- 提供输入框以实时搜索联系人。根据输入的姓名查询数据库,并更新显示的联系人列表。
-
删除联系人:
- 长按联系人条目会显示确认删除对话框,用户可以选择确认或取消删除操作。
-
双击退出提示:
- 用户按下返回键时,应用会提示“再按一次返回键退出通讯录”。如果在 2 秒内再次按下返回键,应用将退出。
-
权限检查:
- 应用在启动时检查所需的权限,确保有权访问联系人信息。
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇