如何更快地建立此联系人页面?

时间:2016-11-02 23:41:57

标签: java android android-fragments contacts android-contacts

我想知道为什么我的代码需要很长时间才能打开。我的Android设备(LG G4)需要2-4秒才能打开这个片段。我有一个手机联系人类,我想在其中检索这些变量。

    public class PhoneContact {
    public String contact_name = "";
    public String contact_number = "";
    public int contact_id = 0;
}

为了给这些联系人充气,我有一个listview片段来显示这些数据。我通过这样做来显示片段:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle SavedInstanceState){
    myFragmentView = inflater.inflate(R.layout.fragment_phonecontacts, container, false);
    getPhoneContact();
    return myFragmentView;
}

最后,为了检索我的手机通讯录信息,我这样做了:

    public void getPhoneContact() {
    ArrayList<PhoneContact> phoneContacts = new ArrayList<PhoneContact>();
    Cursor cursor = null;
    ContentResolver contentResolver = getActivity().getContentResolver();
    try{
        cursor = contentResolver.query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    } catch (Exception e){
        Log.e("Error on contact list", e.getMessage());
    }

    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()){
            PhoneContact phoneContact = new PhoneContact();
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            phoneContact.contact_name = name;

            int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
            if (hasPhoneNumber > 0) {

                Cursor phoneCursor = contentResolver.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                        , null
                        , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"
                        , new String[]{id}
                        , null);

                while (phoneCursor.moveToNext()){
                    String number = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneContact.contact_number = number;
                }
                phoneCursor.close();
            }
            phoneContacts.add(phoneContact);
        }
        PhoneContactsAdapter adapter = new PhoneContactsAdapter(this.getContext(), phoneContacts);
        ListView listView = (ListView) myFragmentView.findViewById(R.id.listview_phoneContacts);
        listView.setAdapter(adapter);
    }
}

检查光标是否能够遍历联系人数据库。 如果是,则通过每个联系人并获取他们的ID,姓名,电话号码。 一旦没有更多的联系人搜索我关闭光标然后使手机联系。主联系人被添加到数组中,然后通过适配器绑定到列表视图。

有没有人对如何提高速度或以其他方式退出我的手机联系人提出任何建议。

2 个答案:

答案 0 :(得分:0)

我认为您应该在AsyncTask中执行getPhoneContact,然后您可以通过publishPorgress发布结果以获得良好的用户体验。另外,在将联系人视图添加到列表中时,使用带有notifyItemInserted而不是ListView的RecyclerView将具有很好的动画

答案 1 :(得分:0)

因此,您目前在设备上对每个联系人进行查询(假设大多数(如果不是全部)联系人都包含电话号码)。

相反,您可以在单个查询中获得相同的日期 - 有关联系人的所有数据实际上都存储在一个表 Data 中,该表支持与 Contacts 表的隐式联接 .

Map<Long, PhoneContact> contacts = new HashMap<Long, PhoneContact>();

String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Phone.NUMBER};
// you can add more mimetypes here if you need more info, e.g. emails
String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "')"; 
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String number = cur.getString(2);

    // only add to the hashmap if this is a newly found contact
    if (!contacts.containsKey(id)) {
        PhoneContact phoneContact = new PhoneContact();
        phoneContact.contact_id = id;
        phoneContact.contact_name = name;
        phoneContact.contact_number = number;
        contacts.put(id, phoneContact);
    }
}
cur.close();

// You'll now have all info in `contacts`, you can get a list of just the values via `contacts.values()`

顺便说一下,您的 PhoneContact 类似乎不支持每个联系人的多个电话,您可以将您的类更改为 List<String> phones; 而不是单个 String,然后修改上面的代码有点支持添加多部手机。