网络资源模板--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. 权限检查

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

四、完整的项目源码

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

相关推荐
潜龙95273 小时前
第3.2.3节 Android动态调用链路的获取
android·调用链路
追随远方4 小时前
Android平台FFmpeg音视频开发深度指南
android·ffmpeg·音视频
撰卢5 小时前
MySQL 1366 - Incorrect string value:错误
android·数据库·mysql
恋猫de小郭6 小时前
Flutter 合并 ‘dot-shorthands‘ 语法糖,Dart 开始支持交叉编译
android·flutter·ios
牛马程序小猿猴6 小时前
15.thinkphp的上传功能
android
林家凌宇6 小时前
Flutter 3.29.3 花屏问题记录
android·flutter·skia
时丶光7 小时前
Android 查看 Logcat (可纯手机方式 无需电脑)
android·logcat
血手人屠喵帕斯7 小时前
事务连接池
android·adb
恋猫de小郭8 小时前
React Native 前瞻式重大更新 Skia & WebGPU & ThreeJS,未来可期
android·javascript·flutter·react native·react.js·ios
一人一萧十只猫�8 小时前
MySQL 从入门到精通(三):日志管理详解 —— 从排错到恢复的核心利器
android·mysql·adb