Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SimpleCorsOrAdapter和ListView筛选联系人_Java_Android_Adapter_Android Arrayadapter_Simplecursoradapter - Fatal编程技术网

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;但仍不起作用。