【问题标题】:Contact Details coming improper order联系方式来错订单
【发布时间】:2012-06-28 11:31:19
【问题描述】:

我正在尝试访问模拟器中所有联系人的联系人详细信息。我得到了访问其他详细信息所需的解决方案。访问电话和电子邮件类型时出现问题。我使用下面的代码来获取电话类型和电子邮件类型。应用程序正在运行,没有编译错误。

完整代码

public class GetAllDatas extends Activity {

ListView lvItem;
private Button btnAdd;
String Ptype, Etype;
int contactPhoneType;

String displayName="", emailAddress="", phoneNumber="";
ArrayList<String> contactlist=new ArrayList<String>(); 
ArrayAdapter<String> itemAdapter;

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

    lvItem = (ListView)this.findViewById(R.id.lvitems); 
    btnAdd = (Button)this.findViewById(R.id.btnAddItem);

    itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactlist); 
    lvItem.setAdapter(itemAdapter);

    btnAdd.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) {
            readContacts();
        }
    });

} 

private void readContacts()
{
    ContentResolver cr =getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


    while (cursor.moveToNext()) 
    {
        displayName  = "" ;
        ArrayList<String> phoneNumber  = new ArrayList<String>();
        ArrayList<String> emailAddress  = new ArrayList<String>();

        displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
        String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

        /*                   Email                   */ 

        Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null, null);
        while (emails.moveToNext()) 
        {
            emailAddress.add(emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 

             int contactPhoneType = emails.getInt(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));



             switch(contactPhoneType){
                case ContactsContract.CommonDataKinds.Email.TYPE_HOME: 
                     Etype = "Home";
                     break; 
                case ContactsContract.CommonDataKinds.Email.TYPE_WORK: 
                    Etype = "Work";
                    break;
                case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: 
                    Etype = "Mobile";

                    break;
                case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: 
                    Etype = "Other";
                    break;
           }                  
       }



        emails.close(); 


      /*            Phone Number and Type   */ 

        if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
        {
            Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
            while (pCur.moveToNext()) 
            {
                 phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 

                  contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));


                 switch(contactPhoneType){
                    case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
                         Ptype = "Home";
                         break; 
                    case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: 
                        Ptype = "Work";
                        break; 
                    case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:  
                        Ptype = "Mobile";
                        break; 
                    case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: 
                        Ptype = "Other";
                        break;
               }                  
           }  



            pCur.close();  
        }   

int phoneNumberCount = phoneNumber.size();
int emailCount = emailAddress.size();

// Add arraylist data to contactlist..

if(phoneNumberCount > emailCount) {

    for (int i=0; i<phoneNumberCount; i++)
      {
        if(emailCount>i)
          {
           contactlist.add(displayName +  " , " +  Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n");    
           }
        else
        {
          contactlist.add(displayName + " , " +  Ptype + " , " + phoneNumber.get(i) + " , " + " , " + "\n");
        } 
       }
    }
    else  
       {
        for (int i=0; i<emailCount; i++) 
         {
        if(phoneNumberCount>i)
          {
            contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " +  Etype + " , " + emailAddress.get(i) + "\n"); 
          }
        else
        { 
          contactlist.add(displayName + " , " + " , " + " , " + Etype + " , " + emailAddress.get(i) +  "\n");
        }
      }
    }      
    }
    Collections.sort(contactlist);
    itemAdapter.notifyDataSetChanged();
    cursor.close(); 
} 
 }

问题是,我在 ListView 中得到了不正确顺序的电话类型和电子邮件类型。这意味着我将 2 个号码 [Home, Mobile] 和 2 个电子邮件 [Home, Work] 保存到特定联系人。当我运行代码时,此联系人的 ListView 显示变为对于数字 [Mobile, Work] 和电子邮件 [Mobile, Work]。我无法更正代码。如何使 ListView 正确显示。有人知道如何调试吗?

【问题讨论】:

  • 我不明白....数字不正确吗?是否显示工作号码的手机号码?或者它们是否正确,而您只是希望它们以不同的顺序显示?
  • 实际上显示包括5个详细信息... Name, NumberType, Number, EmailTYPE, Email...表示号码类型表示个人号码或家庭号码或手机...电子邮件类型也是像这样......它的顺序不正确......这是我保存了 2 个号码和 2 封电子邮件以联系 KARTHIK 的图像---第一个号码类型是家庭,第二个号码类型是手机,第一个电子邮件类型是家庭和 2 个工作,但是它显示为手机和电子邮件的移动和工作(tinypic.com/view.php?pic=2eydeli&s=6
  • 发布您的适配器代码,它可能在那里。还要检查您的数据...如果它在其他地方工作但不适用于此联系人,则很有可能您在创建此联系人时将信息保存为错误的类型(或者在我看来)。
  • 我编辑代码并粘贴它。请检查它

标签: android android-contacts


【解决方案1】:

问题出在您的循环中...每个项目只有一个变量,并且每次都在重新设置它。

当您创建要添加到列表视图的字符串时,您只有通过每个循环的最后一次迭代的值。

您应该将大部分字符串创建移到这些循环中。

在循环外开始字符串,设置联系人姓名,然后通过电话#循环在每次迭代中添加电话号码(和类型),然后在每次迭代中将电子邮件(和类型)添加到字符串中通过电子邮件循环。

编辑

我想这就是你想要的:

private void readContacts() {
    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null);

    while (cursor.moveToNext()) {
        displayName = "";

        displayName = cursor
                .getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String id = cursor.getString(cursor
                .getColumnIndex(ContactsContract.Contacts._ID));
        String holder = "";
        holder = holder + displayName;

        /* Phone Number and Type */

        if (Integer
                .parseInt(cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Cursor pCur = cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                            + " = ?", new String[] { id }, null);
            while (pCur.moveToNext()) {

                contactPhoneType = pCur
                        .getInt(pCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                switch (contactPhoneType) {
                case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
                    holder = holder + ", Home";
                    break;
                case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
                    holder = holder + ", Work";
                    break;
                case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
                    holder = holder + ", Mobile";
                    break;
                case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER:
                    holder = holder + ", Other";
                    break;
                }
                holder = holder
                        + ", "
                        + (pCur.getString(pCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            }
            pCur.close();
        }

        /* Email */
        Cursor emails = cr.query(Email.CONTENT_URI, null, Email.CONTACT_ID
                + " = " + id, null, null);
        while (emails.moveToNext()) {
            int contactPhoneType = emails
                    .getInt(emails
                            .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
            switch (contactPhoneType) {
            case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
                holder = holder + ", Home";
                break;
            case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
                holder = holder + ", Work";
                break;
            case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE:
                holder = holder + ", Mobile";
                break;
            case ContactsContract.CommonDataKinds.Email.TYPE_OTHER:
                holder = holder + ", Other";
                break;
            }
            holder = holder
                    + ", "
                    + (emails
                            .getString(emails
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        }
        emails.close();
        contactlist.add(holder);
    }
    Collections.sort(contactlist);
    itemAdapter.notifyDataSetChanged();
    cursor.close();
}

【讨论】:

  • 检查我粘贴在我的部分中的上述评论,并检查你得到想法的图像链接。我做了几乎所有类型的编辑但没有用。你需要完整的编码吗?
  • 帮帮我,我没有得到答案
  • 巴拉克你得到了答案,我没有得到答案,让我知道实际问题在哪里?
  • 使用您的完整代码很容易找到问题所在。请参阅我的更新答案。
  • 感谢您与我保持联系以完成这项工作,您最多 95 % OK。小问题是当我将 2 个号码和 2 个电子邮件保存给特定联系人时,显示会像(tinypic.com/view.php?pic=m93s6a&s=6),但是您的代码给我这样的显示(tinypic.com/view.php?pic=2nm0pw6&s=6),您的代码与我的代码,所以我正在尝试编辑您的代码以获得所需的显示,如果您有时间,您可以比我更容易地编辑自己的代码。再次感谢。
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2012-02-05
  • 2014-09-18
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多