android - 在两行ListView中列出联系信息

标签 android listview android-contacts android-cursor android-contentresolver

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

onCreate()中,我创建了ContentResolver对象,调用方法get_list()来获取姓名和电话号码并尝试显示ListView:

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

读取联系信息的方法get_list()如下所示:

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

    if (cur.getCount() > 0) {

        while (cur.moveToNext()) {
            int i=0;
            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];
        }
    }



// only one value
        for(int i=0; i < cur.getCount(); i++){
            Log.d("telefonnummer07", "telefonnummer07 " + telefonname[i] + "|" + telefonnummer[i]);
        }
    cur.close();
    return zusammengesetzt;
}

但是结果如下: enter image description here

更新 问题是,人名数组 (telefonname[]) 和电话号码 (telefonnummer[]) 只进入了 while 循环get_list() 方法获取正确的内容。在 while 循环之外,数组仅获得最后一个值。请参阅上面的方法get_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);

以及 get_list() 方法:

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

}

非常感谢您的帮助。

另一个问题是,没有电话号码的电子邮件地址或联系人不应在此列表中。如何实现这一目标?

最佳答案

我不是增量,这就是问题所在

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

关于android - 在两行ListView中列出联系信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32666551/

相关文章:

android - 如何查询两个日期之间的内容解析器?

wpf - ListView 中的多重绑定(bind)

安卓写联系人

android - ContactsContract.Contacts.Entity IllegalArgumentException异常

android - session 已关闭;进一步的改变是非法的

java - Android Studio itemsAdapter 和自定义 ListView 不起作用

javascript - 地理定位 Phonegap Android 不工作

java - 带有自定义 CellFactory 的 ListView 修剪不可见的节点

JavaFx 自定义 ListCell 为空

Android - 使用手机所有者的 AccountManager/First and Last name 获取 UserData