MultiAutoCompleteTextView与联系人电话号码

时间:2014-03-16 22:14:59

标签: android android-contacts autocompletetextview android-cursoradapter contactscontract

我需要使用用户设备上的联系人电话号码创建一个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我可以输入四个联系人,然后随机访问,点击一个删除它。我希望能够做到这一点。怎么样?

1 个答案:

答案 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);