2

내 전화 번호부에서 연락처 목록을 보여주는 프로그램을 개발했습니다. 이 들어 나는 다음과 같은 코드를 사용합니다특정 연락처 만 표시

ContentResolver cr = getContentResolver(); 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'", 
      null, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
    if (cursor != null && cursor.getCount() > 0) { 
     while (cursor.moveToNext()) { 
      String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(id)); 
      Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, 
        null, 
        null); 
      if (phones != null) { 
        while (phones.moveToNext()) { 
         String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         contactList.add(new Contact(name, phoneNumber, id)); 
        } 

       phones.close(); 
      } 
     } 
     cursor.close(); 
    } 
    adapter = new ContactAdapter(contactList, R.layout.contacts_list_item, getApplicationContext()); 
    recyclerView.setAdapter(adapter); 

모든 작품을, 프로그램 내 전화 번호부에서 모든 연락처를 표시하지만 나는 접촉의 특정 번호가를 표시 할. 예 : 전화 번호부에서 처음 50 개의 연락처를로드하고 스크롤 한 후 다음 50 개의 연락처가 목록의 끝에로드됩니다. 등등

+1

이것을 위해 새로 고침 기능을 구현해야합니다 –

+0

@AbdulWaheed 처음에 다운로드 한 대화 상대 수를 어떻게 제한합니까? –

답변

1

사용. 코드를 아래에 바꿉니다

Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1' ", 
      null, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC LIMIT 10"); 

처음 10 개 레코드가 있습니다. 그리고 구현을 새로 고침하기 위해 당겨서 새로 고침하기 위해 콜백 이벤트에 대한 더 많은 레코드를 확보하십시오. 희망이 도움이 될 것입니다

+0

작동하지만 이미 다운로드 한 연락처가 있기 때문에 OnLoadMoreListener에서 다음 10 개의 연락처를 다운로드하려면 어떻게해야합니까? –

+0

@AndriiAfanaskoko가 도움을 주면 받아 들일 수있는 답변을 표시하십시오 –

+0

얼마나 많은 레코드를 기록해야합니까? 당신은로드하고 그에 따라 얼마나 많은 사람들을 업데이트해야합니까? –

-1

모든 연락처를로드하는 것이 매우 느리기 때문에 원하는 이유가 있다고 가정합니다. 매우 느린 이유는 현재 연락처 당 쿼리가 1 개이므로 사용자에게 연락처가 500 개있는 경우 500 개의 쿼리를 실행해야하기 때문입니다.

쿼리 수를 1 개로 줄이면 제한이 필요 없다고 가정 할 수 있습니다.

String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER }; 
Cursor phones = getContentResolver().query(Phone.CONTENT_URI, projection, null, null, Phone.DISPLAY_NAME + " ASC"); 

while (phones.moveToNext()) { 
    String name = phones.getString(1); 
    String phone = phones.getString(2); 
    Long id = phones.getLong(0); 

    contactList.add(new Contact(name, phone, id)); 
} 
phones.close(); 

당신이 접촉 당 하나의 항목 만 표시 할, 그리고 전화 당, 당신이 대신 ListHashMap<Long, Contact>을 할 수 있도록 contactList 필드를 변경하고, 경우 기존 Contact 객체에 새로 발견 전화를 추가 할 수 있습니다

지도에 이미 있습니다. 같은

뭔가 : 제한 원인을이 코드 아래

Contact contact = allContacts.get(id); 
if (contact == null) { 
    contact = new Contact(name, phone, id); 
    allContacts.put(id, contact); 
} else { 
    contact.addPhone(phone); // you'll need to implement this 
}