Java 如何使用SimpleCorsOrAdapter和ListView筛选联系人
我正在尝试在我的应用程序中添加搜索联系人功能。Java 如何使用SimpleCorsOrAdapter和ListView筛选联系人,java,android,adapter,android-arrayadapter,simplecursoradapter,Java,Android,Adapter,Android Arrayadapter,Simplecursoradapter,我正在尝试在我的应用程序中添加搜索联系人功能。 一切正常,但搜索联系人功能不起作用。 我花了两天时间试图实现这个功能,但我不知道我在哪里犯了错误。如果有人能找出错误,请写下答案。 private void getContactResults () { //TODO get contacts code here Toast.makeText(this, "Getting contacts ....", Toast.LENGTH_LONG).sho
一切正常,但搜索联系人功能不起作用。
我花了两天时间试图实现这个功能,但我不知道我在哪里犯了错误。如果有人能找出错误,请写下答案。
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();
}
});
private void getContactResults(){
//TODO在此处获取联系人代码
Toast.makeText(这是“获取联系人…”),Toast.LENGTH_LONG.show();
li=(ListView)findViewById(R.id.list);
Cursor Cursor=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,null,null);
开始管理游标(游标);
最后一个字符串phoneNumber=contacts contract.commondatakings.Phone.NUMBER;
最后一个字符串phoneName=contacts contract.commonDataTypes.Phone.DISPLAY\u NAME;
最后一个字符串phoneID=contacts contract.commonDataTypes.Phone.\u ID;
最后一个字符串[]ContactsList={phoneName,phoneNumber,phoneID};
final int[]to={android.R.id.text1,android.R.id.text2};
final SimpleCursorAdapter ArrayAdapter=新的SimpleCursorAdapter(这是android.R.layout.simple\u list\u item\u 2,光标,联系人列表,收件人);
li.setAdapter(ArrayAdapter);
li.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE);
新的ArrayList(Arrays.asList((ContactsList));
//按搜索筛选联系人
li.setTextFilterEnabled(true);
ArrayAdapter.setFilterQueryProvider(新的FilterQueryProvider(){
@凌驾
公共游标运行查询(CharSequence约束){
Cursor cur=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,null,null);
返回电流;
}
});
EditText queryText=(EditText)findViewById(R.id.search_框);
addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共无效(最终字符序列、最终整数开始、最终整数计数、最终整数之后){
}
@凌驾
public void onTextChanged(最终字符序列、最终整数开始、最终整数之前、最终整数计数){
//这是正在运行的过滤器
ArrayAdapter.getFilter().filter(s.toString());
//别忘了通知适配器
ArrayAdapter.notifyDataSetChanged();
}
@凌驾
公共无效后文本更改(最终可编辑){
//这是正在运行的过滤器
ArrayAdapter.getFilter().filter(s.toString());
//别忘了通知适配器
ArrayAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this,“数据已更改”,Toast.LENGTH_SHORT.show();
}
});
错误在上面的代码中。看起来您没有使用约束
值
它应该像
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.
错误在上面的代码中。看起来您没有使用约束
值
它应该像
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.
新字符串[]{constraint}>>>不兼容的类型,必需的java.lang.String,找到java.lang.CharSequenceI添加字符串mconstraints=String.valueOf(constraint);然后游标cur=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT_URI,null,ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME,新字符串[]{mconstraint},null);返回cur;但仍不工作。新建字符串[]{constraint}>>>不兼容类型,需要java.lang.String,找到java.lang.CharSequenceI添加了字符串mconstraints=String.valueOf(constraint);然后游标cur=getContentResolver().query(ContactsContact.CommonDataTypes.Phone.CONTENT_URI,null,ContactsContact.CommonDataTypes.Phone.DISPLAY_名称,新字符串[]{mconstraint},null);返回cur;但仍不起作用。