如何快速接触装载在Android的ListView(How to fast the contacts

2019-09-16 17:57发布

在我的应用我列出在ListView接触。 无接触的是1000+。 我得到的接触

通过使用ContentResolver的查询是cr.query(...),存储在一个ArrayList的值

和负载setListAdapter(...)数组列表后。 显示所有联系人我

应用程序需要近1分钟,从而我使用异步任务,但通过使用异步任务没有大的差异。

我需要2到4秒内显示所有联系人。 我检查在Android模拟器默认联系人应用程序这是在2到4秒内的负载。 我有花

很长一段时间在谷歌。 但我无法得到任何有用的解决方案。 请帮助我如何快速列表视图上装载的接触。 请帮我。

我的编码样本:

    private ArrayList<ContactListEntry> loadContactListInternal(String searchString) {
        ArrayList<ContactListEntry> contactList = new ArrayList<ContactListEntry>();
    ContentResolver cr = getContentResolver();
    Cursor cur = null;
    String[] projection = new String[] {BaseColumns._ID,ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts.PHOTO_ID};
    ....
        cur=cr.query(ContactsContract.Contacts.CONTENT_URI, projection, selection, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

    while (cur.moveToNext()) {
         int id = Integer.parseInt(cur.getString(0));
             ....   
        if (input !=null)
            photo = BitmapFactory.decodeStream(input);
         ....
        ArrayList<ContactListEntry.PhoneEntry> phoneEntries = new ArrayList<ContactListEntry.PhoneEntry>();

            String[] projection1 = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.TYPE};    
            Cursor pcur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,projection1, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { String.valueOf(id) }, null);
            while (pcur.moveToNext()) {
                ...
            }
            pcur.close();

            ContactListEntry entry = new ContactListEntry(id, name, photo, phoneEntries);
            contactList.add(entry);
    }
    cur.close();

    return contactList;
}
    .....
    in another class
        private void selectionUpdated() {
                ....
         setListAdapter(new SelectedArrayAdapter(this, app.selectedContacts));
            ... 
       }

Answer 1:

所以,你的问题是,你为每个联系人做了很多的子查询。 我很久了一次同样的问题。 我的情况是,我发现很多的接触,并允许用户点击其中任何一个。 从那以后,我开始处理在另一活动的联系人。

那时候我终于决定,我应该只显示名称和懒洋洋地获取后来所有其他数据,就在我启动下一个活动。 这是惊人的:几乎200的系数降低我的程序的速度和操作成为用户完全不可见。

默认的Android清单不相同的,如果我没看错的 - 只显示名字,后来就加载所有其他接触相关的数据。



Answer 2:

我使用光标适配器和我切割DATABSE,arrayadapter和优化代码。



Answer 3:

使用投影和选择论的概念以检索在我的案件为500个联系人的通讯录intially,将采取12秒。

现在,它正在采取350毫秒(每种不超过秒)

void getAllContacts() {
    long startnow;
    long endnow;

    startnow = android.os.SystemClock.uptimeMillis();
    ArrayList arrContacts = new ArrayList();

    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
    Cursor cursor = ctx.getContentResolver().query(uri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,   ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.Contacts._ID}, selection, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");

    cursor.moveToFirst();
    while (cursor.isAfterLast() == false) {

        String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        int phoneContactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
        int contactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        Log.d("con ", "name " + contactName + " " + " PhoeContactID " + phoneContactID + "  ContactID " + contactID)

        cursor.moveToNext();
    }
    cursor.close();
    cursor = null;

    endnow = android.os.SystemClock.uptimeMillis();
    Log.d("END", "TimeForContacts " + (endnow - startnow) + " ms");
}

这个链接的更多信息http://www.blazin.in/2016/02/loading-contacts-fast-from-android.html ....



Answer 4:

考虑有只有一个查询和摆脱子查询的想法(如已经建议)。 您可以使用内容开放的只是查询实现速度:

"ContactsContract.CommonDataKinds.Phone.CONTENT_URI"

该URI也有“ContactsContract.Contacts.DISPLAY_NAME”字段。

您可能还需要考虑这样做查询,并在一个单独的线程与您的适配器的工作,使其完全透明的。

这为我工作。



Answer 5:

优化的解决方案这里.....

private static final String[] PROJECTION = new String[] {
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER
    };
.
.
.

ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null);
        if (cursor != null) {
            try {
                final int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
                final int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

                String name, number;
                while (cursor.moveToNext()) {
                    name = cursor.getString(nameIndex);
                    number = cursor.getString(numberIndex);
                }
            } finally {
                cursor.close();
            }
        }

干杯...:)



文章来源: How to fast the contacts loading in listview on android