我需要使用用户设备上的联系人电话号码创建一个MultiAutoCompleteTextView。我需要的是类似于gmail;除了使用gmail电子邮件地址。对于联系人,我有以下需求:
每个电话号码必须是一个条目。因此,如果John有3个数字(家庭,单元格,工作),则显示为3个条目
每个条目都可以通过电话号码或人名/姓名进行搜索
要创建我的适配器,我尝试修改Google提供的适配器,但是当我下载样本时,它无法编译(当开箱即用时,这种糟糕的体验,但我我正在尝试解决它)。然后使用http://developer.android.com/reference/android/widget/MultiAutoCompleteTextView.html处的示例,我将MultiAutoCompleteTextView绑定到适配器。此时,我不确定如何转换适配器以满足我的需求(即按名称或电话搜索联系人并检索数字)。所以我的求助是这样的:有没有人成功完成这个并且不介意分享他们的代码?或者有谁知道如何修改链接的适配器给我电话号码,我可以通过名称或电话搜索?第三,适配器是否适用于MultiAutoCompleteTextView?
注意
在提出这个问题时,我对谷歌如何为电子邮件实施MultiAutoCompleteTextView做了一些假设。有谁知道该代码是否是开源的?有谁知道我的假设是否正确?我实现联系电话MultiAutoCompleteTextView的想法是否有效?
更新
所以自从提出问题以来,我已经走了很长的路。我现在正在AutoComplete with name and number as in native sms app Android使用答案。但我试图将实现转换为MultiAutoCompleteTextView,但它不允许多个条目。有谁知道我怎么能完成这个?
更新2
请参阅AutoComplete with name and number as in native sms app Android:
我的MultiAutoCompleteTextView目前正在运行:它允许多个条目。我只是将AutoCompleteTextView
替换为MultiAutoCompleteTextView
,我忽略了其他答案的onItemClick
建议。它有效,有点儿。除此之外,我得到的数据不是你在gmail EditText
中看到的很好的格式化元素。回到最初的问题:谷歌是如何做到的?我不想花时间解释gmail如何构成editText,因为相关读者可以轻松验证这一点。在他们的EditText
我可以输入四个联系人,然后随机访问,点击一个删除它。我希望能够做到这一点。怎么样?
答案 0 :(得分:2)
试试这个:
final Resources res = getResources();
LinearLayout ll = new LinearLayout(this);
AutoCompleteTextView tv = new AutoCompleteTextView(this);
tv.setThreshold(1);
String[] from = { Phone.DISPLAY_NAME };
int[] to = { android.R.id.text1 };
SimpleCursorAdapter a = new SimpleCursorAdapter(this, android.R.layout.simple_dropdown_item_1line, null, from, to, 0);
a.setStringConversionColumn(2); // Phone.NUMBER
ViewBinder viewBinder = new ViewBinder() {
@Override
public boolean setViewValue(View v, Cursor c, int index) {
TextView tv = (TextView) v;
int typeInt = c.getInt(3); // Phone.TYPE
CharSequence type = Phone.getTypeLabel(res, typeInt, null);
// Phone.DISPLAY_NAME + Phone.NUMBER + type
tv.setSingleLine(false);
tv.setText(c.getString(1) + "\n" + c.getString(2) + " " + type);
return true;
}
};
a.setViewBinder(viewBinder);
FilterQueryProvider provider = new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
// run in the background thread
Log.d(TAG, "runQuery constraint: " + constraint);
if (constraint == null) {
return null;
}
ContentResolver cr = getContentResolver();
Uri uri = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, constraint.toString());
String[] proj = { BaseColumns._ID, Phone.DISPLAY_NAME, Phone.NUMBER, Phone.TYPE, };
return cr.query(uri, proj, null, null, null);
}
};
a.setFilterQueryProvider(provider);
tv.setAdapter(a);
ll.addView(tv, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
setContentView(ll);