修改联系人查询发送的窗口,设置输入框号码完全匹配某个联系人时,才显示号码对应的联系人名称。

This commit is contained in:
ZhanGSKen
2025-09-06 01:52:37 +08:00
parent 37b0867d34
commit 4d344b299b
5 changed files with 169 additions and 114 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Fri Sep 05 17:21:44 GMT 2025
#Fri Sep 05 17:49:46 GMT 2025
stageCount=8
libraryProject=
baseVersion=15.3
publishVersion=15.3.7
buildCount=10
buildCount=16
baseBetaVersion=15.3.8

View File

@@ -117,8 +117,9 @@ public class ComposeSMSActivity extends BaseActivity {
}
});
// 初始化联系人列表
// 初始化联系人列表(关键:设置单选模式,确保选中状态生效)
mlvContracts = (ListView) findViewById(R.id.activitycomposesmsListView1);
mlvContracts.setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 开启单选,与布局中一致
// 初始化号码输入框(核心:优化文本变化监听逻辑)
metTO = (EditText) findViewById(R.id.activitycomposesmsEditText1);
@@ -172,7 +173,7 @@ public class ComposeSMSActivity extends BaseActivity {
}
}
// 核心优化:根据输入号码筛选列表(无结果则显示空列表)
// 核心优化:根据输入号码筛选列表(无结果则显示空列表,优化选中逻辑
private void filterListByPhone(String inputPhone) {
PhoneUtil phoneUtil = new PhoneUtil(this);
List<PhoneBean> allContacts = phoneUtil.getPhoneList();
@@ -191,22 +192,29 @@ public class ComposeSMSActivity extends BaseActivity {
// 用筛选结果更新列表(无结果则传入空列表)
initAdapter(matchedContacts.isEmpty() ? new ArrayList<PhoneBean>() : matchedContacts);
// 定位到第一个匹配项(如果有)
// 定位并选中匹配项(如果有)
if (!matchedContacts.isEmpty()) {
//LogUtils.d(TAG, String.format("matchedContacts.size() %d", matchedContacts.size()));
// 先设置列表选中项
//mlvContracts.setSelection(0);
boolean isFound = false;
for (int i = 0; i < matchedContacts.size(); i++) {
PhoneBean item = matchedContacts.get(i);
//LogUtils.d(TAG, String.format("item.getTelPhone() %s", item.getTelPhone()));
//LogUtils.d(TAG, String.format("metTO.getText() %s", metTO.getText()));
if (item.getTelPhone().equals(metTO.getText().toString())) {
// 精确匹配号码(兼容区域码格式)
if (phoneUtil.isTheSamePhoneNumber(item.getTelPhone(), inputPhone)) {
mtvTOName.setText(item.getName());
// 关键:先滚动到目标位置,再设置选中状态
mlvContracts.setSelection(i);
LogUtils.d(TAG, String.format("%s match %s", metTO.getText().toString(), item.getTelPhone()));
// 主动设置选中(确保样式生效,兼容部分系统)
mlvContracts.setItemChecked(i, true);
LogUtils.d(TAG, String.format("%s 匹配 %s选中位置%d", inputPhone, item.getTelPhone(), i));
isFound = true;
break;
}
}
// 若未精确匹配,选中第一个结果
/*if (!isFound) {
mlvContracts.setSelection(0);
mlvContracts.setItemChecked(0, true);
mtvTOName.setText(matchedContacts.get(0).getName());
}*/
} else {
mtvTOName.setText(""); // 无结果时清空姓名显示
}
@@ -219,7 +227,9 @@ public class ComposeSMSActivity extends BaseActivity {
List<PhoneBean> matchedContacts = phoneUtil.getPhonesByName(searchName);
initAdapter(matchedContacts);
if (!matchedContacts.isEmpty()) {
// 选中第一个结果并设置样式
mlvContracts.setSelection(0);
mlvContracts.setItemChecked(0, true);
}
}
@@ -293,19 +303,45 @@ public class ComposeSMSActivity extends BaseActivity {
mSimpleAdapter.setDropDownViewResource(R.layout.listview_contracts);
mlvContracts.setAdapter(mSimpleAdapter);
// 列表项点击事件
// 列表项点击事件:点击时主动设置选中状态,确保样式突显
mlvContracts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position < mAdapterData.size()) {
// 1. 主动设置当前项为选中状态
mlvContracts.setItemChecked(position, true);
// 2. 更新号码输入框和姓名显示
String phone = mAdapterData.get(position).get(MAP_PHONE).toString();
metTO.setText(phone);
mtvTOName.setText(phoneUtil.getNameByPhone(phone));
// 3. 滚动到点击位置(确保可见)
mlvContracts.setSelection(position);
}
}
});
// 列表项选中状态变化监听(可选,增强选中反馈)
mlvContracts.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// 选中时可添加额外反馈(如改变文本颜色,可选)
if (view != null) {
TextView tvName = (TextView) view.findViewById(R.id.listviewcontractsTextView1);
TextView tvPhone = (TextView) view.findViewById(R.id.listviewcontractsTextView2);
if (tvName != null) tvName.setTextColor(getResources().getColor(R.color.white));
if (tvPhone != null) tvPhone.setTextColor(getResources().getColor(R.color.white));
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// 未选中时无操作
}
});
} else {
mSimpleAdapter.notifyDataSetChanged(); // 数据更新时通知适配器
// 数据更新时,先取消所有旧选中状态,再通知适配器刷新
mlvContracts.clearChoices();
mSimpleAdapter.notifyDataSetChanged();
}
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 选中状态:深灰色背景(可根据需求调整颜色) -->
<item android:state_selected="true" android:drawable="@color/list_item_selected"/>
<!-- 按压状态:浅灰色背景 -->
<item android:state_pressed="true" android:drawable="@color/list_item_pressed"/>
<!-- 默认状态:透明背景 -->
<item android:drawable="@android:color/transparent"/>
</selector>

View File

@@ -89,12 +89,15 @@
android:padding="10dp"
android:layout_weight="1.0">
<!-- 关键修改:添加 listSelector 属性,关联选中样式 -->
<ListView
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/activitycomposesmsinclude1"
android:id="@+id/activitycomposesmsListView1"/>
android:id="@+id/activitycomposesmsListView1"
android:listSelector="@drawable/listview_item_selector"
android:choiceMode="singleChoice"/> <!-- 开启单选模式,确保选中状态唯一 -->
<include
layout="@layout/view_smssend"

View File

@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#FFFFFFFF</color>
<color name="colorSMSSendColor">#FFDCDA3D</color>
<color name="colorSMSInboxColor">#FF3DDC84</color>
<color name="colorTTSRuleViewBackgroundColor">#FFDCDA3D</color>
@@ -24,4 +27,8 @@
<color name="colorSMSInboxColorTao">#FFD9D9D9</color>
<color name="colorTTSRuleViewBackgroundColorTao">#FFB4B4B4</color>
<!-- 列表项选中颜色(深灰) -->
<color name="list_item_selected">#FF696969</color>
<!-- 列表项按压颜色(浅灰) -->
<color name="list_item_pressed">#FFE0E0E0</color>
</resources>