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

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

四、完整的项目源码

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

相关推荐
Dnelic-2 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen4 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年12 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿14 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神15 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛15 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法16 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter17 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快18 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl18 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5