【问题标题】:get details of contact selected from list view获取从列表视图中选择的联系人的详细信息
【发布时间】:2012-09-09 10:02:15
【问题描述】:

我正在设计应用程序,我希望允许用户选择多个联系人来向其发送消息。我已经使用以下代码成功检索了带有复选框的列表视图中的用户列表。现在我希望当用户单击“完成”按钮时,所有选定联系人的 PHONE NUMBER 应在 EDITTEXT 中以 John 、Rick 并且所有包含仅10位数字即“9898xxxxxx”的电话号码应自动存储在以逗号分隔的字符串中(9898xxxxxx,9988xxxxxx)。我怎样才能完成要求。

public class ContactsActivity extends ListActivity {

protected static final String TAG = null;
public String[] Contacts = {};
public int[] to = {};
public ListView myListView;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contacts);
    final Button done_Button = (Button) findViewById(R.id.done_Button);
    final Button clear_Button =(Button) findViewById(R.id.clear_Button);
    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);
    clear_Button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(),"Selections Cleared", Toast.LENGTH_SHORT).show();
            ClearSelections();
        }
    });

    /** When 'Done' Button Pushed: **/
    done_Button.setOnClickListener(new View.OnClickListener() {
        public void onClick (View v){
            Log.i(TAG,":Done Button Selected:");
            SparseBooleanArray selectedPositions = myListView.getCheckedItemPositions();
            Log.i(TAG,"Number of Checked Positions: " + selectedPositions.size());
            for (int i=0; i<selectedPositions.size(); i++) {
                if (selectedPositions.get(selectedPositions.keyAt(i)) == true) {
                    //do stuff

                }
            }
        }
    });
}

private void ClearSelections() {
    int count = this.myListView.getAdapter().getCount();
    for (int i = 0; i < count; i++) {
        this.myListView.setItemChecked(i, false);
    }
}

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);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_contacts, menu);
    return true;
}
}

【问题讨论】:

  • 您可能应该找出您从 selectedPosition 获得的内容类型,获取.....部分代码。
  • @JoxTraex 我没有得到所选联系人的真实电话号码,而是得到了一些奇怪的值..
  • 找出那些奇怪的值是什么,它应该与您的联系数据相关。
  • @JoxTraex 但我如何真正获得所有选定联系人的真实电话号码?
  • 您应该阅读联系人是如何存储在 android 2.2+ 中的,这将提供一些见解(提示:并非全部在一个表中)

标签: android listview checkbox contact


【解决方案1】:

终于配置好了

        done_Button.setOnClickListener(new View.OnClickListener() {
        public void onClick (View v){
            String name = null;
            String number = null;
            long [] ids = myListView.getCheckedItemIds();
            for(long id : ids) {
                Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id + "" }, null);
                while(contact.moveToNext()){
                    name = contact.getString(contact.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    //name+=name;
                    number = contact.getString(contact.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    //number+=number;
                }
                Toast.makeText(getApplicationContext(), "Name: " +name + "\n" + "Number: " + number , Toast.LENGTH_LONG).show();
            }
        }
    });

【讨论】:

    【解决方案2】:
    String numberListString = "";
    
    for (int i=0; i<selectedPositions.size(); i++) {
                    if (selectedPositions.get(selectedPositions.keyAt(i)) == true) {
                        //do stuff
                        numberListString  = numberListString + "," + numberAtCurrentSelectedPostion;
    
                    }
                }
    
    mEditText.setText(numberListString);
    

    【讨论】:

    • 这不是特别有用。愿意解释一下您是如何获得numberListString的吗?
    • @Luksprog :抱歉不清楚。 numberListString 最初只是空的,我们将继续将当前数字附加到它。
    【解决方案3】:

    按下完成按钮试试这个:-

    done_Button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                name.clear();
                number.clear();
                Log.i(TAG, ":Done Button Selected:");
                SparseBooleanArray selectedPositions = myListView
                        .getCheckedItemPositions();
                Log.i(TAG,
                        "Number of Checked Positions: "
                                + selectedPositions.size());
                Cursor cur = getContacts();
                for (int i = 0; i < selectedPositions.size(); i++) {
                    if (selectedPositions.get(selectedPositions.keyAt(i)) == true) {
                        // do stuff
                        cur.moveToPosition(selectedPositions.keyAt(i));
                        name.add(cur.getString(1));
                    }
                }
                for (int i = 0; i < name.size(); i++) {
                    Cursor lCursor = getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null, "DISPLAY_NAME = ? ",
                            new String[] { name.get(i) }, null);
                    lCursor.moveToFirst();
                    number.add(lCursor.getString(lCursor
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    lCursor.close();
                }
    
            }
        });
    

    其中 name 和 number 是 String 类型的数组列表。您将获得所有选定的名称和数字。现在您可以在 Edit Text 中随意显示它们了。

    我想这会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多