2

我有一个联系人选择器列表,其中包含具有电话号码的联系人的存储箱。 现在,我的问题是,似乎无法得到检查联系人的姓名和电话号码。多个联系人选择器列表

这里是我的代码:

import android.app.ListActivity; 
    import android.content.ContentResolver; 
    import android.content.Intent; 
    import android.database.Cursor; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.provider.ContactsContract; 
    import android.provider.ContactsContract.CommonDataKinds.Phone; 
    import android.util.Log; 
    import android.util.SparseBooleanArray; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.ListAdapter; 
    import android.widget.ListView; 
    import android.widget.SimpleCursorAdapter; 

    public class Create_Group extends ListActivity implements OnClickListener{ 

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

     Button save_button; 

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

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

      // 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.save_group_button: 

       int checked_Names_Counter = 0; 

       // Goes over the list of contacts and checks which were checked 
       for (int j = 0; j < myListView.getCount(); j++) 
       { 
        if (myListView.isItemChecked(j) == true) 
        { 
         Cursor cur = getContacts(); 
         ContentResolver contect_resolver = getContentResolver(); 
         cur.moveToFirst(); 

         /** 
         * Here I tried to compare the IDs but each list has different IDs so it didn't really help me... 
         // Converts the current checked name ID into a String 
         String Checked_ID = String.valueOf(myListView.getCheckedItemIds()[checked_Names_Counter]); 

         // Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name 
         while (Checked_ID != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID))) 
         { 
          cur.moveToNext(); 
         } 
         */ 

         /** 
         * Here I tried to compare the names, even though it's not a good pratice, and it didn't work either... 
         String Checked_Name = myListView.getAdapter().getItem(checked_Names_Counter).toString(); 

         // Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name 
         while (Checked_Name != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME))) 
         { 
          cur.moveToNext(); 
         } 
         */ 
         String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 
         String name = ""; 
         String no = ""; 

         Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
           ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 


         name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
         no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         id = null; 
         name = null; 
         no = null; 
         phoneCur = null; 
         checked_Names_Counter++; 

        } 
       } 

       // Goes back to the Manage Groups screen 
       i = new Intent(this, Manage_Groups.class); 
       startActivity(i); 
       break; 
     } 

     } 
    } 

任何想法?

谢谢!

回答

2

看起来你是如此接近,我用ListView.getCheckedItemIds()返回所选联系人的唯一ID:

public void onClick(View view) { 
    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); 

     // Do whatever you want with the data 
    } 
} 

加成

我有一个快速的问题这段代码:

// Goes back to the Manage Groups screen 
i = new Intent(this, Manage_Groups.class); 
startActivity(i); 

这是否带给用户回到以前活动?如果是这样,您应该使用finish();。 finish()结束当前Activity,将其从堆栈中释放并释放所有内存(浪费的内存减少意味着更快的应用程序)。它还允许先前的Activity在其离开时恢复保存的状态(填充EditTexts,之前的Spinner选项,切换按钮和复选标记等)。活动从用户停止的地方恢复。

+0

是的,它确实返回到之前的活动,我将添加您所说的内容。另外,我只检查了您简要发布的内容,但我认为它效果很好,稍后我会完成检查。谢谢!!! – user1476876

+0

@ user1476876如果这个答案对您有帮助,请点击左上角的复选标记。 – Sam

+2

作为其他人看到此答案的警告。您不应该在主线程上调用ContentResolver.query。由于调用将执行文件IO,因此您有冒险获得ANR的风险。将联系人加载到加载程序或AsyncTask或类似程序中。您还可以编辑查询以在一个查询中加载所有相关联系人,而不是每个联系人一个查询。 –

相关问题