带有复选框的 Android 联系人选择器

Posted

技术标签:

【中文标题】带有复选框的 Android 联系人选择器【英文标题】:Android Contact Picker With Checkbox 【发布时间】:2012-09-06 22:45:19 【问题描述】:

有很多关于同一主题的讨论,但在这里花了 4 小时后,我找不到有效的描述或链接来制作带有复选框的联系人选择器。

我有一个带有 DONE 按钮和 listview 带有 checkbox 的活动。我设法正确显示了联系人。现在我想在bundle 中返回选定的联系电话号码(我认为最好的方法),以便我可以在onActivityResult() 中获取号码列表。我不确定我遵循的方式是否正确。

这是我的代码:

public class ContactPickerMulti extends ListActivity implements OnClickListener 

    // List variables
    public String[] Contacts = ;
    public int[] to = ;
    public ListView myListView;

    Button save_button;
    private TextView phone;
    private String phoneNumber;
    private Cursor cursor;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacts_multi);

        // Initializing the buttons according to their ID
        save_button = (Button) findViewById(R.id.contact_done);

        // Defines listeners for the buttons
        save_button.setOnClickListener(this);

        Cursor mCursor = getContacts();
        startManagingCursor(mCursor);

        ListAdapter adapter = new SimpleCursorAdapter(
                this,
                android.R.layout.simple_list_item_multiple_choice,
                mCursor,
                Contacts = new String[]  ContactsContract.Contacts.DISPLAY_NAME ,
                to = new int[]  android.R.id.text1 );

        setListAdapter(adapter);
        myListView = getListView();
        myListView.setItemsCanFocus(false);
        myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    

    private Cursor getContacts() 
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[]  ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME ;
        String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '"
                + ("1") + "'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                + " COLLATE LOCALIZED ASC";

        return managedQuery(uri, projection, selection, selectionArgs,
                sortOrder);
    

    public void onClick(View src) 
        Intent i;
        switch (src.getId()) 
        case R.id.contact_done:

            SparseBooleanArray selectedPositions = myListView
                    .getCheckedItemPositions();
            SparseBooleanArray checkedPositions = myListView
                    .getCheckedItemPositions();
            if (checkedPositions != null) 
                for (int k = 0; k < checkedPositions.size(); k++) 
                     if (checkedPositions.valueAt(k)) 
                          String name =
                                 ((Cursor)myListView.getAdapter().getItem(k)).getString(1);
                            Log.i("XXXX",name + " was selected");
                        
                
            

            break;
        

    

我想将数字作为数组或列表发送。做这个的最好方式是什么?非常感谢任何帮助或通往正确道路的帮助。

【问题讨论】:

请添加适配器代码,以便我知道您如何获得 phoneNumber。 @Yul 代码已更新..现在它将打印联系人的姓名 :) 我只需要获取电话号码而不是姓名 ;) 完成! 【参考方案1】:

我在onClick使用这个代码:

long[] id = getListView().getCheckedItemIds();//  i get the checked contact_id instead of position
        phoneNumber = new String[id.length];
        for (int i = 0; i < id.length; i++) 

            phoneNumber[i] = getPhoneNumber(id[i]); // get phonenumber from selected id

        

        Intent pickContactIntent = new Intent();
        pickContactIntent.putExtra("PICK_CONTACT", phoneNumber);// Add checked phonenumber in intent and finish current activity.
        setResult(RESULT_OK, pickContactIntent);
        finish();

//

private String getPhoneNumber(long id) 
    String phone = null;
    Cursor phonesCursor = null;
    phonesCursor = queryPhoneNumbers(id);
    if (phonesCursor == null || phonesCursor.getCount() == 0) 
        // No valid number
        signalError();
        return null;
     else if (phonesCursor.getCount() == 1) 
        // only one number, call it.
        phone = phonesCursor.getString(phonesCursor
                .getColumnIndex(Phone.NUMBER));
     else 
        phonesCursor.moveToPosition(-1);
        while (phonesCursor.moveToNext()) 

            // Found super primary, call it.
            phone = phonesCursor.getString(phonesCursor
                    .getColumnIndex(Phone.NUMBER));
            break;

        
    

    return phone;



private Cursor queryPhoneNumbers(long contactId) 
    ContentResolver cr = getContentResolver();
    Uri baseUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
            contactId);
    Uri dataUri = Uri.withAppendedPath(baseUri,
            ContactsContract.Contacts.Data.CONTENT_DIRECTORY);

    Cursor c = cr.query(dataUri, new String[]  Phone._ID, Phone.NUMBER,
            Phone.IS_SUPER_PRIMARY, RawContacts.ACCOUNT_TYPE, Phone.TYPE,
            Phone.LABEL , Data.MIMETYPE + "=?",
            new String[]  Phone.CONTENT_ITEM_TYPE , null);
    if (c != null && c.moveToFirst()) 
        return c;
    
    return null;

以及您开始的活动的最后一个onActivityResultPickContactsActivity

    // TODO Auto-generated method stub
    // super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) 

        if (requestCode == Constants.REQUEST_CODE_PICK_CONTACT) 


            if (data != null) 

                String[] temp = data.getStringArrayExtra("PICK_CONTACT");

            
        

    


【讨论】:

感谢您的回复。非常感谢。顺便说一句,我有错误,phonesCursor = queryPhoneNumbers(id);queryPhoneNumbers(id); 中我应该做什么@ 这是您在onClick getPhoneNumber(id[i]); 中获得的已检查联系人的ID。我将此代码用于我的应用程序,因此我保证它运行。所以你只需要改变一点以适应你的需求 我完全迷路了,这是我当前的代码pastebin.com/tdTpFR6t 你能看一下吗? 可以发一下queryPhoneNumbers(id);的方法吗? 编辑我的帖子。对不起复制错误所以它加倍getPhoneNumber方法【参考方案2】:

newActivity 中使用startActivityForResult(newActivity) 时,您必须先调用setResult(RESULT_OK),然后调用finish() 以关闭Activity。您可以选择在对setResult(RESULT_OK, intent) 的调用中包含Intent。对setResult() 的调用将导致调用onActivityResult() 的实现,您可以在其中处理Activity 的结果。因此,在您的情况下,您只需创建一个 Intenet 并使用 putExtra() 方法之一将您的数组列表添加到其中。然后Intent 将被传递给onActivityResult(),您可以在其中提取该信息。请参阅Intent 和Activity 了解更多信息。

【讨论】:

感谢您的回复。我已经更新了代码,现在我可以获得选中的项目位置。那么如何获取联系方式呢?我的意思是我只有项目位置,我如何查询来制作 LIST?有什么想法吗? 你可以得到任何类型的数据,那么问题出在哪里?放一个 ArrayList 什么的就行了。

以上是关于带有复选框的 Android 联系人选择器的主要内容,如果未能解决你的问题,请参考以下文章

带有光标适配器滚动问题的android列表视图

如何使整行列表视图可点击?

带有微调器和复选框的 Android Listview

带有复选框的 CustomListView

带有 CSS 类名的 <span> 内复选框的 jQuery 选择器

选中复选框时检查Android listview多个项目