【问题标题】:How to Filter Contacts using SimpleCursorAdapter and ListView如何使用 SimpleCursorAdapter 和 ListView 过滤联系人
【发布时间】:2020-07-05 20:08:18
【问题描述】:

我正在尝试在我的应用中添加搜索联系人功能。
一切正常,但搜索联系人功能不起作用。
我尝试实现此功能 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();
           }
       });

【问题讨论】:

    标签: java android adapter android-arrayadapter simplecursoradapter


    【解决方案1】:
      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.
    

    【讨论】:

    • new String[]{constraint} >>>不兼容的类型,需要java.lang.String,找到java.lang.CharSequence
    • 我添加了 String mconstraints = String.valueOf(constraint);然后 Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null ,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, new String[]{mconstraint}, null);返回当前;但仍然无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多