Android 手机通讯录(源码)

时间:2024-02-24 13:19:33

  简易手机通讯录

一:功能模块

  1.主界面,通过listview 展示所有联系人信息,并在没有联系人时给出友好提示

  2.主界面.显示最近查看的某个联系人信息

  3.主界面,可以长按某联系人项,弹出菜单,删除该联系人;删除联系人后,在手机通知栏弹出信息给用户提示

  4.主界面选择分组,可以查看所有联系人,也可以只查看某一分组的联系人

  5.点击主界面的某联系人,可以进入联系人详情界面,查看联系人各详细信息,并可修改联系人各信息

    联系人的性别和所在分组可通过下拉菜单选择;长按电话号码,可以进入拨打电话功能

    修改联系人信息后,跳转回到主界面,并使用Toast给予用户提示

  6.主界面菜单栏可以添加新联系人,关于等功能

  7.能在联系人详情界面,动态增加多个联系电话,并储存到数据库中

效果图展示:

    

     

 

 源码下载地址:

 https://download.csdn.net/download/qq_35471409/10884060

项目回顾:

  1.scrollview嵌套listview产生的滑动冲突(recyclerview)

  解决方案:

        listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP){
                    //点击listview里面滚动停止时,scrollview拦截listview的触屏事件,就是scrollview该滚动了
                    scrollView.requestDisallowInterceptTouchEvent(false);
                }else{
                    //当listview在滚动时,不拦截listview的滚动事件;就是listview可以滚动,
                    scrollView.requestDisallowInterceptTouchEvent(true);
                }
                return false;
            }
        });

 

  2.关于listview 中 EditText  监听

        //1.在设置text前,先移除监听
        if (viewHodler.number.getTag() instanceof TextWatcher) {
            viewHodler.number.removeTextChangedListener((TextWatcher) viewHodler.number.getTag());
        }
        if (TextUtils.isEmpty(phoneNumber.getNumber())){
            viewHodler.number.setText("");
        }else {
            viewHodler.number.setText(phoneNumber.getNumber());
        }
        //2.新建监听类
        TextWatcher watcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (TextUtils.isEmpty(s)) {
                    phoneNumber.setNumber(null);
                    finalViewHodler.imageView.setVisibility(View.GONE);
                } else {
                    phoneNumber.setNumber(s.toString());
                    finalViewHodler.imageView.setVisibility(View.VISIBLE);
                }
                Log.e("tag", "afterTextChanged: " +s.toString() );
            }
        };
        //3.添加监听器
        viewHodler.number.addTextChangedListener(watcher);
        viewHodler.number.setTag(watcher);

    3.获取listview 中所有 Editext 的值

      思路:在适配器中创建HashMap  在getview()方法中 保存所有的Editext     key = position   value = editext

      然后在通过HashMap  获取就行了

private HashMap<Integer,EditText> edMap;

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        PhoneAdapter.ViewHodler viewHodler = null;

        if (convertView == null) {
            viewHodler = new PhoneAdapter.ViewHodler();
            convertView = LayoutInflater.from(context).inflate(R.layout.phone_list_item, null, false);
            viewHodler.spinner = convertView.findViewById(R.id.pnone_spinner);
            viewHodler.number = convertView.findViewById(R.id.pnone_number);
            viewHodler.imageView = convertView.findViewById(R.id.imageView4);
            //put 保存
            edMap.put(position,viewHodler.number);
            spMap.put(position,viewHodler.spinner);
            convertView.setTag(viewHodler);
        } else {
            viewHodler = (PhoneAdapter.ViewHodler) convertView.getTag();
            edMap.put(position,viewHodler.number);
            spMap.put(position,viewHodler.spinner);

        }

    4.拨打电话功能的坑

    public void call(String telPhone){
        if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){
            //要在telPhone前加上字符串tel: 
            Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + telPhone));
            startActivity(intent);
        }
    }

  不让你就会见到下图: