网络资源模板--Android Studio 通讯录App

目录

一、项目演示

二、项目测试环境

三、项目详情​编辑

四、完整的项目源码


一、项目演示

网络资源模板--通讯录App

二、项目测试环境

三、项目详情

首页

java 复制代码
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(); // 返回是否所有权限均已授权
    }
}
  1. 联系人列表管理

    • 使用 RecyclerView 显示联系人列表。
    • 通过 DBManager 从数据库中加载和管理联系人数据。
  2. 添加和编辑联系人

    • 提供按钮以启动添加联系人页面 (AddContactActivity)。
    • 点击联系人条目可以编辑该联系人,启动 EditContactActivity
  3. 搜索联系人

    • 提供输入框以实时搜索联系人。根据输入的姓名查询数据库,并更新显示的联系人列表。
  4. 删除联系人

    • 长按联系人条目会显示确认删除对话框,用户可以选择确认或取消删除操作。
  5. 双击退出提示

    • 用户按下返回键时,应用会提示"再按一次返回键退出通讯录"。如果在 2 秒内再次按下返回键,应用将退出。
  6. 权限检查

    • 应用在启动时检查所需的权限,确保有权访问联系人信息。

四、完整的项目源码

👇👇👇👇👇快捷获取方式👇👇👇👇👇

相关推荐
2501_9445255415 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 预算详情页面
android·开发语言·前端·javascript·flutter·ecmascript
清蒸鳜鱼15 小时前
【Mobile Agent——Droidrun】MacOS+Android配置、使用指南
android·macos·mobileagent
2501_9159184116 小时前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
峥嵘life16 小时前
Android EDLA CTS、GTS等各项测试命令汇总
android·学习·elasticsearch
Cobboo16 小时前
i单词上架鸿蒙应用市场之路:一次从 Android 到 HarmonyOS 的完整实战
android·华为·harmonyos
天下·第二16 小时前
达梦数据库适配
android·数据库·adb
斯文by累16 小时前
Android Studio 2025 SDK路径配置指南
android studio
定偶16 小时前
MySQL知识点
android·数据结构·数据库·mysql
iwanghang16 小时前
Android Studio 2023.2.1 新建项目 不能选择Java 解决方法
android·ide·android studio
似霰16 小时前
JNI 编程指南10——从内存角度看引用类型
android·jni