获取联系人中所选用户的排序顺序首选项>;Android设备中的设置以及如何减少查询时间?
我有两个问题: 1:我的应用程序如何知道用于对本机“Android设备联系人”进行排序的默认排序顺序 在android中的“联系人”->“设置”中,我们有“列表依据””和“显示联系人依据”选项。如何在我的应用程序中获得这些优先权 例如:假设设备联系人按“名字”排序,那个么应用程序应该得到一些常量(或类似的值)。另一方面,若联系人是按“姓氏”排序的,那个么应用程序应该获得关于相同联系人的常量(或信息) 我搜索了SO,得到了这个,但问题是在API级别5中该解决方案被弃用了 这是我获取联系人的查询获取联系人中所选用户的排序顺序首选项>;Android设备中的设置以及如何减少查询时间?,android,android-contacts,android-2.3-gingerbread,Android,Android Contacts,Android 2.3 Gingerbread,我有两个问题: 1:我的应用程序如何知道用于对本机“Android设备联系人”进行排序的默认排序顺序 在android中的“联系人”->“设置”中,我们有“列表依据””和“显示联系人依据”选项。如何在我的应用程序中获得这些优先权 例如:假设设备联系人按“名字”排序,那个么应用程序应该得到一些常量(或类似的值)。另一方面,若联系人是按“姓氏”排序的,那个么应用程序应该获得关于相同联系人的常量(或信息) 我搜索了SO,得到了这个,但问题是在API级别5中该解决方案被弃用了 这是我获取联系人的查询 S
String userPreference = getPrefContacts();/* **getPrefContacts() will return either ContactsContract.Data.DATA2 or ContactsContract.Data.DATA3** */
try {
ContentResolver cr = getActivity().getContentResolver();
String[] projectionName = new String[] {
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DATA2, ContactsContract.Data.DATA5,
ContactsContract.Data.DATA3, ContactsContract.Data.DATA1 };
String sortOrder = userPrefrence
+ " COLLATE LOCALIZED ASC";
Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI,
projectionName, null, null, sortOrder);
nameCursor.moveToFirst();
if (nameCursor.getCount() > 0) {
do {
String fName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA2));
String mName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA5));
String lName = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA3));
String name = nameCursor
.getString(nameCursor
.getColumnIndexOrThrow(ContactsContract.Data.DATA1));
if (name != null) {
String[] projectionCommon = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.HAS_PHONE_NUMBER };
String selectionCommon = ContactsContract.Contacts.DISPLAY_NAME
+ " = ?";
String[] selectionArgCommon = new String[] { name };
Cursor common = cr.query(
ContactsContract.Contacts.CONTENT_URI,
projectionCommon, selectionCommon,
selectionArgCommon, null);
if (common.getCount() > 0) {
while (common.moveToNext()) {
String contactID = common
.getString(common
.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
int hasPhone = common
.getInt(common
.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone > 0) {
String[] projectionPhone = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
String selectionPhone = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?";
String[] selectionArgPhone = new String[] { contactID };
Cursor phoneCursor = cr
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projectionPhone,
selectionPhone,
selectionArgPhone, null);
if (phoneCursor.getCount() > 0) {
while (phoneCursor.moveToNext()) {
String phone = phoneCursor
.getString(phoneCursor
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (phone != null) {
ContactData tmp = new ContactData(
name, fName, mName,
lName, phone, contactID);
if (raw.size() == 0) {
raw.add(tmp);
} else if (!(raw
.get(raw.size() - 1))
.getContactID()
.equalsIgnoreCase(
tmp.getContactID())) {
raw.add(tmp);
}
}
}
}
phoneCursor.close();
}
}
}
common.close();
}
} while (nameCursor.moveToNext());
nameCursor.close();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
我需要getPrefContacts()方法的代码
2:如何减少与上述代码相关的查询时间或任何其他方法
希望任何人都能帮助我
提前感谢。当您为列表活动创建自己的CustomAdapter时,您可以在列表活动中管理排序顺序 数据的过滤和排序由适配器处理。您需要在自定义适配器实现中实现逻辑 适配器通过ListView对象上的setAdapter方法分配给ListView 例如
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor mCursor = getContacts();
startManagingCursor(mCursor);
// now create a new list adapter bound to the cursor.
// SimpleListAdapter is designed for binding to a Cursor.
ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
android.R.layout.two_line_list_item, // Specify the row template
// to use (here, two
// columns bound to the
// two retrieved cursor
// rows).
mCursor, // Pass in the cursor to bind to.
// Array of cursor columns to bind to.
new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME },
// Parallel array of which template objects to bind to those
// columns.
new int[] { android.R.id.text1, android.R.id.text2 });
// Bind to our new adapter.
setListAdapter(adapter);
}
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.IN_VISIBLE_GROUP + " = '"
+ ("1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs,
sortOrder);
}
这里的排序顺序是通过光标来管理的,光标包含列表的数据。我只能回答您的第二个问题 查询内容提供商时,可以使用SQL的join属性。因此,可以删除嵌套的while循环,从而减少查询时间
编辑:对于您的第一个问题,请尝试以下操作: int sort\u order=Settings.system.getInt(getApplicationContext ().getContentResolver(),“android.contacts.SORT_ORDER”)
在我的三星S2设备上,当联系人按姓氏列出时,排序顺序=1,当联系人按姓氏列出时,排序顺序=2。但我想知道:设备排序的顺序是什么,即用户对“按选项列出”(按:姓氏或姓氏列出)的优先顺序是什么。