[英]How to Filter Contacts using SimpleCursorAdapter and ListView
我正在尝试在我的应用中添加搜索联系人功能。
一切正常,但搜索联系人 function 无法正常工作。
我尝试实现此功能 2 天,但我不知道我在哪里做错了。 如果有人能找出错误,请写下答案。
private void getContactResults () {
//TODO get contacts code here
Toast.makeText(this, "Getting contacts ....", Toast.LENGTH_LONG).show();
li = (ListView) findViewById(R.id.list);
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
startManagingCursor(cursor);
final String phoneNumber = ContactsContract.CommonDataKinds.Phone.NUMBER;
final String phoneName = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
final String phoneID = ContactsContract.CommonDataKinds.Phone._ID;
final String[] ContactsList = {phoneName, phoneNumber, phoneID};
final int[] to = {android.R.id.text1, android.R.id.text2};
final SimpleCursorAdapter ArrayAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, ContactsList, to);
li.setAdapter(ArrayAdapter);
li.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
new ArrayList<>(Arrays.asList((ContactsList)));
// Filter contacts by search
li.setTextFilterEnabled(true);
ArrayAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
return cur;
}
});
EditText queryText = (EditText) findViewById(R.id.search_box);
queryText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
// This is the filter in action
ArrayAdapter.getFilter().filter(s.toString());
// Don't forget to notify the adapter
ArrayAdapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(final Editable s) {
// This is the filter in action
ArrayAdapter.getFilter().filter(s.toString());
// Don't forget to notify the adapter
ArrayAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "Data changed", Toast.LENGTH_SHORT).show();
}
});
ArrayAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
return cur;
}
});
错误在上面的代码中。 看起来您没有使用constraint
值
它应该像
ArrayAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null ,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, new String[]{constraint}, null);
return cur;
}
});
根据 android 文档,由于可能出现性能问题,我还建议不要使用 null。
* @param projection A list of which columns to return. Passing null will
* return all columns, which is inefficient.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.