简易手机通讯录
一:功能模块
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); } }
不让你就会见到下图: