获取其号码的联系人姓名的自动填充文本视图?

时间:2014-01-22 01:47:43

标签: java android autocomplete textview android-contacts

我正在尝试学习如何在Android应用中制作自动完成文本视图,根据用户输入的与联系人姓名的一部分相匹配的字母,可以在其中显示联系人的下拉列表。

我将如何做到这一点?我在google上花了好几个小时而没有找到完整的解决方案,我觉得这很奇怪。

任何帮助将不胜感激!

谢谢,

初学Android开发者

更多细节: 我希望有一个类似于默认消息传递应用程序的收件人框的文本框,我可以在其中输入联系人的姓名,并显示联系人姓名及其编号的建议,我可以点击这些用我点击的那个联系人的号码填写我的文本框。

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

修改您希望显示UI的方式

//我只是对数字进行硬编码,然后追加数字并附加。

public class MainActivity extends Activity implements TextWatcher {

String[] arrcontact = null;
AutoCompleteTextView myAutoComplete;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myAutoComplete = (AutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1);

    loadContact();

    myAutoComplete.addTextChangedListener(this);
    myAutoComplete.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_dropdown_item_1line, arrcontact));
}

private void loadContact() {
    Cursor cursor = getContacts();
    arrcontact = new String[30];

    int count = 0;

    while (cursor.moveToNext()) {
        String displayName = cursor.getString(cursor
                .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));


        arrcontact[count] = displayName + "\n" + "908228282";
        count++;
        if (count == 30)
            break;

    }
}

private Cursor getContacts() {
    // Run query
    final ContentResolver cr = getContentResolver();
    String[] projection = { ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts._ID };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ?";
    String[] selectionArgs = { "1" };
    final Cursor contacts = cr.query(ContactsContract.Contacts.CONTENT_URI,
            projection, selection, selectionArgs, "UPPER("
                    + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
    return contacts;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub

}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
        int arg3) {
    // TODO Auto-generated method stub

}

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

}

答案 1 :(得分:1)

嗨,这可以解决你的需求吗?

http://developer.android.com/guide/topics/ui/controls/text.html#AutoComplete

只要您在StringArray中有联系人列表,就可以使用此API。

====================================

根据您添加的评论,您似乎还需要这篇文章在抓住联系方式中使用 ContentResolver 查询进行的操作,以及然后从帖子中创建一个StringArray,如帖子所示:

Android - Autocomplete with contacts

kedark 的解决方案很好并且完整,但这种特殊方法对初学者来说可能更容易理解)

private Cursor grabContacts(){
    // Form an array specifying which columns to return. 
    String[] projection = new String[] {People._ID, People.NAME};

    // Get the base URI for the People table in the Contacts content provider.
    Uri contacts =  People.CONTENT_URI;

    // Make the query. 
    Cursor managedCursor = managedQuery(contacts, projection, null, null, People.NAME + " ASC"); // Put the results in ascending order by name
    startManagingCursor(managedCursor);
    return managedCursor;
}

如果有帮助,你可以投票给他们:)

答案 2 :(得分:0)

我更新了Kedark的loadContact()例程,适用于任何长度的联系人列表(如下),否则效果很好。谢谢!

    private String[] loadContactList() {
        String[] contactArray;
        Cursor cursor = getContacts();

        contactArray = new String[cursor.getCount()];

        int count = 0;

        while (cursor.moveToNext()) {
            String displayName = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
            contactArray[count] = displayName;
            count++;
        }
        cursor.close();
        return(contactArray);
    }