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

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

四、完整的项目源码

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

相关推荐
八月林城35 分钟前
echarts在uniapp中使用安卓真机运行时无法显示的问题
android·uni-app·echarts
雨白1 小时前
搞懂 Fragment 的生命周期
android
casual_clover1 小时前
Android 之 kotlin语言学习笔记三(Kotlin-Java 互操作)
android·java·kotlin
梓仁沐白1 小时前
【Kotlin】数字&字符串&数组&集合
android·开发语言·kotlin
技术小甜甜1 小时前
【Godot】如何导出 Release 版本的安卓项目
android·游戏引擎·godot
火柴就是我1 小时前
Dart 原始字符串(Raw Strings)详解文档
android
玲小珑2 小时前
Auto.js 入门指南(五)实战项目——自动脚本
android·前端
玲小珑2 小时前
Auto.js 入门指南(四)Auto.js 基础概念
android·前端
没有了遇见3 小时前
DrawerLayout 滑动冲突
android
玲小珑4 小时前
Auto.js 入门指南(六)多线程与异步操作
android·前端