Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 游标加载程序/适配器未显示正确的值_Android_Contacts_Simplecursoradapter - Fatal编程技术网

Android 游标加载程序/适配器未显示正确的值

Android 游标加载程序/适配器未显示正确的值,android,contacts,simplecursoradapter,Android,Contacts,Simplecursoradapter,我正试图从联系人中查询昵称和SIP地址。我遇到的问题是,它们都存储在DATA1列中。因此,当我运行查询时,我只检索昵称。检索它们并将它们传递到下面的SimpleCursorAdapter中的方法是什么 CursorLoader c = new CursorLoader(getActivity(), baseUri, CONTACTS_NUMBER_PROJECTION2, Data.MIMETYPE+" ='" + Nickname.CONTENT_ITEM_TYPE+"'", null, OR

我正试图从联系人中查询昵称和SIP地址。我遇到的问题是,它们都存储在DATA1列中。因此,当我运行查询时,我只检索昵称。检索它们并将它们传递到下面的
SimpleCursorAdapter
中的方法是什么

CursorLoader c = new CursorLoader(getActivity(), baseUri, CONTACTS_NUMBER_PROJECTION2, Data.MIMETYPE+" ='" + Nickname.CONTENT_ITEM_TYPE+"'", null, ORDER);

private static final String[] CONTACTS_NUMBER_PROJECTION2 = new String[] {
SipAddress.DISPLAY_NAME,
SipAddress.SIP_ADDRESS,
BaseColumns._ID};
使用
SimpleCursorAdapter
Nickname.NAME
SipAddress.SIP_ADDRESS
都是昵称

SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), R.layout.contact_list, null,  
                          new String[] {Nickname.NAME, SipAddress.SIP_ADDRESS},
                          new int[] {R.id.text1, R.id.text2}, 0);
屏幕截图如下所示。较小的字体应为Sip地址

如果我将
Nickname.CONTENT\u ITEM\u TYPE
更改为
SipAddress.CONTENT\u ITEM\u TYPE
我将获得Sip地址而不是昵称。我不知道怎样才能让两个人都出现

更新:


我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不会显示在同一行:

更新2:

我将sip和nick name值存储在StructuredName.DISPLAY_name和StructuredName.GIVEN_name下,然后用适配器加载它们。我将selectionArgs更改为Data.MIMETYPE+“=”+StructuredName.CONTENT\u ITEM\u TYPE+“”

结果是:

如上所述,不同mimetype的联系人详细信息存储在一个contacts数据表中的不同记录中,并且与contactId有一对一的关系。正因为如此,实际上不可能(我认为)在一个游标行中获得sip编号和昵称

下面是数据库方案片段

要插入两个StructuredName值,应使用单次插入:

    contacts.add(ContentProviderOperation
                                .newInsert(
                                        ContactsContract.Data.CONTENT_URI)
                                .withValueBackReference(
                                        ContactsContract.Data.RAW_CONTACT_ID,
                                        0)
                                .withValue(
                                        ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                        currentNickName)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
                                        currentSipNo)
                                .build());
要以列表的形式显示来自两种不同mimetype的数据,如果设置了正确的顺序(首先按contactId,然后按mimetype),则可以使用两列GridView

如果需要full行自定义,您可以创建包含sip nick pair的简单对象的ArrayList,使用contactId排序的两个CUsor(nick和sip)中的数据填充它,然后使用Array adapter在listview中显示它们

或者,您可以在自定义适配器中加载两个游标:用于昵称和数字。例如,扩展SimpleCursorAdapter,沿着基游标将另一个游标传递到其构造函数中。然后,在newView/bindView中,您可以在附加光标中执行查找并获得相应的数据。

如前所述,不同MIMEType的联系人详细信息存储在一个contacts数据表中的不同记录中,并且与contactId有一对一的关系。正因为如此,实际上不可能(我认为)在一个游标行中获得sip编号和昵称

下面是数据库方案片段

要插入两个StructuredName值,应使用单次插入:

    contacts.add(ContentProviderOperation
                                .newInsert(
                                        ContactsContract.Data.CONTENT_URI)
                                .withValueBackReference(
                                        ContactsContract.Data.RAW_CONTACT_ID,
                                        0)
                                .withValue(
                                        ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                                        currentNickName)
                                .withValue(
                                        ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
                                        currentSipNo)
                                .build());
要以列表的形式显示来自两种不同mimetype的数据,如果设置了正确的顺序(首先按contactId,然后按mimetype),则可以使用两列GridView

如果需要full行自定义,您可以创建包含sip nick pair的简单对象的ArrayList,使用contactId排序的两个CUsor(nick和sip)中的数据填充它,然后使用Array adapter在listview中显示它们


或者,您可以在自定义适配器中加载两个游标:用于昵称和数字。例如,扩展SimpleCursorAdapter,沿着基游标将另一个游标传递到其构造函数中。然后,在newView/bindView中,您可以在附加光标中执行查找,并获取相应的数据。

所以,请删除数据。MIMETYPE?未知列类型是指昵称.DATA5、昵称.DATA6等?是的。本例中未指定联系人提供程序的行为,但我们希望它是正常的。一个小实验,我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不在同一行。检查更新的问题,我添加了一个屏幕截图。这意味着不同mime类型的数据确实存储在不同记录的单个数据表中,通过mimetype键进行区分。然后,在单个列表视图行中混合sip编号和昵称的唯一方法是自定义适配器。我会编辑答案顺便问一下,如果多个sip nos(或很少)昵称连接到一个联系人id,你会怎么做?所以请删除Data.MIMETYPE?未知列类型是指昵称.DATA5、昵称.DATA6等?是的。本例中未指定联系人提供程序的行为,但我们希望它是正常的。一个小实验,我将昵称.NAME和SipAddress.SIP_地址分别更改为昵称.DATA7和昵称.DATA*。为我的SelectionAgs添加了“null”。实际上,我会同时显示昵称和sip地址,但不在同一行。检查更新的问题,我添加了一个屏幕截图。这意味着不同mime类型的数据确实存储在不同记录的单个数据表中,通过mimetype键进行区分。然后,在单个列表视图行中混合sip编号和昵称的唯一方法是自定义适配器。我会编辑答案顺便问一下,如果几个sip号(或很少)昵称连接到一个联系人id,你会怎么做?