Android 在两行列表视图中列出联系人信息

Android 在两行列表视图中列出联系人信息,android,listview,android-contacts,android-cursor,android-contentresolver,Android,Listview,Android Contacts,Android Cursor,Android Contentresolver,我想在两行列表视图中列出联系人详细信息(姓名、电话号码)(第一行:姓名,第二行:电话号码)。我成功地获得了联系人的所有必要信息,但在列表视图中列出联系人时遇到了问题。只有第一个联系人显示在列表视图中 在onCreate()中,我创建ContentResolver对象,调用方法get\u list()获取姓名和电话号码,并尝试显示列表视图: ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsC

我想在两行
列表视图中列出联系人详细信息(姓名、电话号码)(第一行:姓名,第二行:电话号码)。我成功地获得了联系人的所有必要信息,但在
列表视图中列出联系人时遇到了问题。只有第一个联系人显示在
列表视图中

onCreate()
中,我创建
ContentResolver
对象,调用方法
get\u list()
获取姓名和电话号码,并尝试显示
列表视图

 ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    int anzahl = cur.getCount();
    Log.d("anzahl09", "anzahl09 " + anzahl);

    telefonname = new String[anzahl];
    telefonnummer = new String[anzahl];
    zusammengesetzt = new String[anzahl];

    kontakte_laden = new String[anzahl][anzahl];

    String[] telefonname_telefonnummer = new String[anzahl];
    telefonname_telefonnummer = get_list(cur, cr);

    int i =0;
    do {
        Log.d("schleife09", "schleife09 " + i + "|" + telefonname_telefonnummer[i] + "|" +  telefonname[i] + "|" + telefonnummer[i] + "|" + kontakte_laden[i][i]);
        kontakte_laden[i][0] = telefonname[i];
        kontakte_laden[i][1] = telefonnummer[i];
        i++;
    } while (i < anzahl);


    ListView listview = ( ListView ) findViewById ( android.R.id.list );

    listview.setPadding ( 20, 20, 20, 20 );

    @SuppressWarnings("Convert2Diamond") ArrayList< HashMap< String, String > > list = new ArrayList< HashMap< String, String > > ();


    for (String[] anAussehen : kontakte_laden) {
        //noinspection Convert2Diamond
        item = new HashMap<String, String>();
        item.put("line1", anAussehen[0]);
        item.put("line2", anAussehen[1]);
        list.add(item);
    }


    SimpleAdapter sa = new SimpleAdapter(this, list,
            android.R.layout.two_line_list_item,
            new String[]{"line1", "line2"},
            new int[]{android.R.id.text1, android.R.id.text2});


    listview.setAdapter(sa);


    listview.setOnItemClickListener(listViewOnItemClickListener);
但结果如下:

更新 问题是,人名(
telefonname[]
)和电话号码(
telefonnumer[]
)的数组只在
get_list()
方法的while循环中获得了正确的内容。在while循环之外,数组仅获取最后一个值。请参阅上面的方法
get\u list()

解决方案 我改变了以下几点:

  • 我在前面直接定义了全局字符串数组的编号和名称。因此,在
    get_list()
    方法中,我必须定义两个新的字符串数组
  • 我将名称和电话号码指向这些新的本地字符串数组
  • 将这些新的本地字符串数组引用到全局字符串数组
这是工作代码:

onCreate()
方法:

ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


    int anzahl = cur.getCount();
    Log.d("anzahl09", "anzahl09 " + anzahl);

    telefonname_global = new String[anzahl];
    telefonnummer_global = new String[anzahl];


    kontakte_laden = new String[anzahl][anzahl];

    get_list(cur, cr);


    int i =0;
    do {
        Log.d("schleife09", "schleife09 " + i + "|" /*+ telefonname_telefonnummer[i] + "|" */ +  telefonname_global[i] + "|" + telefonnummer_global[i] + "|" + kontakte_laden[i][i]);
        kontakte_laden[i][0] = telefonname_global[i];
        kontakte_laden[i][1] = telefonnummer_global[i];
        i++;
    } while (i < anzahl);


    ListView listview = ( ListView ) findViewById ( android.R.id.list );

    listview.setPadding ( 20, 20, 20, 20 );

    @SuppressWarnings("Convert2Diamond") ArrayList< HashMap< String, String > > list = new ArrayList< HashMap< String, String > > ();


    for (String[] anAussehen : kontakte_laden) {
        //noinspection Convert2Diamond
        item = new HashMap<String, String>();
        item.put("line1", anAussehen[0]);
        item.put("line2", anAussehen[1]);
        list.add(item);
    }


    SimpleAdapter sa = new SimpleAdapter(this, list,
            android.R.layout.two_line_list_item,
            new String[]{"line1", "line2"},
            new int[]{android.R.id.text1, android.R.id.text2});


    listview.setAdapter(sa);



    listview.setOnItemClickListener(listViewOnItemClickListener);
private void get_list(Cursor cur, ContentResolver cr){

    int i = 0;

    if (cur.getCount() > 0) {

        String[] telefonname = new String[cur.getCount()];
        String[] telefonnummer = new String[cur.getCount()];


        while (cur.moveToNext()) {

            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            telefonname[i] = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            Log.d("telefonname09", "telefonname09 " +telefonname[i]);

            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                if (Integer.parseInt(cur.getString(cur.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()) {
                        telefonnummer[i] = pCur.getString( pCur.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER ) );
                        Log.d("telefonnummer09", "telefonnummer09 " + telefonnummer[i]);
                    }

                    pCur.close();
                }
            }

            Log.d("telefonnummer08", "telefonnummer08 " + telefonnummer[i]);
            telefonname_global[i] = telefonname[i];
            telefonnummer_global[i] = telefonnummer[i];

            i++;
        }
    }

    // Fehler: Array telefonnummer hat nur einen Wert
    for(int j=0; j < cur.getCount(); j++){
        Log.d("telefonnummer07", "telefonnummer07 " + telefonname_global[j] + "|" + telefonnummer_global[j]);
    }


     cur.close();

}
非常感谢你的帮助


另一个问题是,没有电话号码的电子邮件地址或联系人不应该在此列表中。如何做到这一点

i不是增量,这是问题所在

private String[] get_list(Cursor cur, ContentResolver cr){

if (cur.getCount() > 0) {
   // inialize outside
    int i=0;
    while (cur.moveToNext()) {

        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        telefonname[i] = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        Log.d("telefonname09", "telefonname09 " +telefonname[i]);

        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            if (Integer.parseInt(cur.getString(cur.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()) {
                    telefonnummer[i] = pCur.getString( pCur.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER ) );
                    Log.d("telefonnummer09", "telefonnummer09 " + telefonnummer[i]); // correct values
                }
                pCur.close();
            }
        }

        zusammengesetzt[i] = telefonname[i] + "|" + telefonnummer[i];

       //i is need to increment
       i++;
    }
}
仅当电话号码存在时添加

 for (String[] anAussehen : kontakte_laden) {
  if(anAussehen[1] != null)
  {
    //noinspection Convert2Diamond
    item = new HashMap<String, String>();
    item.put("line1", anAussehen[0]);
    item.put("line2", anAussehen[1]);
    list.add(item);
  }
}
for(字符串[]anAussehen:kontakte_-ladden){
if(anAussehen[1]!=null)
{
//无检查转换器2钻石
item=newhashmap();
项目.投入(“第1行”,anAussehen[0]);
项目.投入(“第2行”,anAussehen[1]);
列表。添加(项目);
}
}

我已经结束了从Android手机检索最快解决方案的搜索。ContactDTO是pojo类

它将按“联系人显示名称”的升序返回结果

公共静态列表getPhone(上下文){
List contactList=new ArrayList();
ContentResolver cr=context.getContentResolver();
字符串[]投影=新字符串[]{
Contacts contract.raw contacts.\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,
ContactsContract.CommonDataTypes.Phone.PHOTO\u URI,
Contacts contract.CommonDataTypes.Phone.NUMBER,
ContactsContract.CommonDataTypes.Photo.CONTACT_ID};
Uri Uri=ContactsContract.CommonDataTypes.Phone.CONTENT\u Uri;
字符串筛选器=“”+Contacts Contacts.Contacts.HAS_PHONE_NUMBER+”>0和“+PHONE.TYPE+”=”+PHONE.TYPE_MOBILE;
字符串顺序=Contacts contract.Contacts.DISPLAY_NAME+“ASC”;//限制“+限制+“偏移量”+lastId+”;
游标phoneCur=cr.query(uri、投影、过滤器、null、顺序);
while(phoneCur.moveToNext()){
ContactDTO dto=新ContactDTO();
setName(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
dto.setMobileNo(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
dto.setPhotoUrl(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
dto.setContactId(“+phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataTypes.Photo.CONTACT_ID));
联系人列表。添加(dto);
}
phoneCur.close();
返回联系人列表;
}

谢谢您的评论。没有出现异常。get\u list()方法的name、number的值是正确的。如果您说您的get\u list()方法是正确的,那么这里显然没有错误,但是适配器的大小是多少,您检查过吗?请参阅我编辑的post将光标移动到第一行。cursor.moveToFirst()您指的是之前的while(cursor.moveToNext())?结果是,不再显示任何内容谢谢你的回答。你是对的,我忘记了I的增量。但不幸的是,结果是一样的。在while循环开始之前移动I声明我找到了这个问题的解决方案并编辑了我的帖子。非常感谢你的帮助。但是还有一个问题:我不想显示e-m没有电话号码的所有地址和联系人。如何实现此目的?@user3603935如果只有电话号码,我会更新代码。
 for (String[] anAussehen : kontakte_laden) {
  if(anAussehen[1] != null)
  {
    //noinspection Convert2Diamond
    item = new HashMap<String, String>();
    item.put("line1", anAussehen[0]);
    item.put("line2", anAussehen[1]);
    list.add(item);
  }
}
public static List<ContactDTO> getPhone(Context context){
            List<ContactDTO> contactList = new ArrayList<ContactDTO>();
            ContentResolver cr = context.getContentResolver(); 
            String[] PROJECTION = new String[] { 
                    ContactsContract.RawContacts._ID, 
                    ContactsContract.Contacts.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

            Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
            String filter = ""+ ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 and " + Phone.TYPE +"=" + Phone.TYPE_MOBILE;     
            String order = ContactsContract.Contacts.DISPLAY_NAME + " ASC";// LIMIT " + limit + " offset " + lastId + "";

            Cursor phoneCur = cr.query(uri, PROJECTION, filter, null, order);
            while(phoneCur.moveToNext()){
                 ContactDTO dto = new ContactDTO();
                 dto.setName("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
                 dto.setMobileNo("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                 dto.setPhotoUrl("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)));
                 dto.setContactId("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.CONTACT_ID)));
                 contactList.add(dto);
             }
             phoneCur.close();
            return contactList;
}