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

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

四、完整的项目源码

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

相关推荐
带电的小王1 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡1 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道2 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库2 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道3 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe3 小时前
Android Hook - 动态加载so库
android
居居飒4 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He7 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗7 小时前
Android笔试面试题AI答之Android基础(1)
android
qq_397562318 小时前
android studio更改应用图片,和应用名字。
android·ide·android studio