2

私のアプリでは、リストビューに連絡先をリストしています。連絡先の数は1000以上です。私は連絡先を取得します

cr.query(...) であるContentResolver クエリを使用して、配列リストに値を格納します。

その後、配列リストを setListAdapter(...) にロードします。すべての連絡先を表示するには

アプリは1分近くかかるので、非同期タスクを使用しますが、非同期タスクを使用しても大きな違いはありません。

2 ~ 4 秒以内にすべての連絡先を表示する必要があります。2〜4秒以内にロードされるAndroidシミュレーターのデフォルトの連絡先アプリケーションをチェックインします。 私は過ごしました

久しぶりのグーグル。しかし、私は役立つ解決策を得ることができませんでした。リストビューで連絡先の読み込みを高速化する方法を教えてください。私を助けてください。

私のコーディングサンプル:

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

5 に答える 5

1

したがって、問題は、連絡先ごとに多くのサブクエリを実行することです。私は昔々同じ問題を抱えています。私の場合は、多くの連絡先を表示し、ユーザーがそれらのいずれかをクリックできるようにしました。その後、別のアクティビティで連絡先の処理を開始しました。

その時、私は最終的に、次のアクティビティを開始する直前に、名前だけを表示し、他のすべてのデータを後で遅延フェッチすることにしました。これは驚くべきことでした。プログラムの速度がほぼ 200 分の 1 に低下し、操作がユーザーから完全に見えなくなりました。

私が間違っていなければ、デフォルトの Android リストは同じことを行います。名前だけが表示され、後で連絡先に関連する他のすべてのデータが読み込まれます。

于 2012-04-25T10:29:30.420 に答える
1

私はカーソルアダプターを使用し、データベース、アレイアダプターを切り取り、コードを最適化します。

于 2012-05-25T12:13:29.210 に答える
0

最適化されたソリューションはこちら.....

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

乾杯...:)

于 2015-02-24T07:11:28.410 に答える