2015-05-06 1 views
1

Я хочу отображать свои контакты в recyclerview с картой. Проблема заключается в том, что он отображается только один контакт несколько раз. То же самое имя отображается на каждой карте. Кажется, что курсор не переходит к следующему контакту. Но я не знаю почему. И я должен признать, что я совершенно новичок в андроиде. Вот код:ContactList в RecyclerView с картой

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.contacts); 
    RecyclerView recList = (RecyclerView) findViewById(R.id.cardList); 
    recList.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(this); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 
    recList.setLayoutManager(llm); 


    contactRecAdapter ca = new contactRecAdapter(data); 
    recList.setAdapter(ca); 
    data = displayContact(); 
} 

и мой displayContact():

private ArrayList<contactInfo> displayContact(){ 

    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); 
    String name ; 
    String number; 
    String id; 

    contactInfo cI = new contactInfo(); 

    if(cur.getCount()>1){ 
     while (cur.moveToNext()){ 
      id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      if(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0){ 

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

       while (pCur.moveToNext()){ 
        number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        cI.number =number; 
       } 
       data.add(cI); 
       pCur.close(); 
      } 

     } 
    } 

    cur.close(); 
    return data; 
} 

Спасибо!

+0

Эй, сначала вам нужно собрать данные, а затем установить их в адаптер. Попробуйте изменить значение onCreate() data = displayContact(); contactRecAdapter ca = новый контактRecAdapter (данные); recList.setAdapter (ca); –

ответ

0

Что вам нужно понять, так это то, что в настоящее время у вас есть 1 объект contactInfo, и вы добавляете этот объект contactInfo в данные (arraylist).

Давайте сними его на шаг за шагом. Это код в данный момент:

  1. Создайте объект contactInfo (назовем его C1).
  2. Задайте имя как «abc» и номер «123».
  3. Добавьте этот C1 в данные arraylist. -> По существу, аррайалист держит ссылку на то, где этот C1 находится в памяти (то есть он указывает только на C1)
  4. Курсор обнаружил другой контакт и задал имя C1 для «def» и номер «456»,
  5. Добавьте этот C1 в данные arraylist. (На данный момент, что аррайалист содержит на самом деле 2 ссылки, оба указывающие на C1)
  6. Предполагая, что курсор ничего не находит и, наконец, возвращает данные arraylist.

После этого вы получите arraylist, который содержит 2 записи, и оба из них состоят из контактного имени «def» и number «456».

Вместо этого, я бы рекомендовал на основе вашего кода просто добавить еще одну строку для создания нового объекта contactInfo каждый раз, когда вы находите новый контакт, перед установкой имени.

private ArrayList<contactInfo> displayContact(){ 

    ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); 
    String name ; 
    String number; 
    String id; 
    contactInfo cI; //Remove the creation of cI object at the start 

    if(cur.getCount()>1){ 
     while (cur.moveToNext()){ 
      id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      if(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0){ 

       cI = new contactInfo(); //Add in this to create a new cI object when there's a new contact 

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

       while (pCur.moveToNext()){ 
        number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        cI.number =number; 
       } 
       data.add(cI); 
       pCur.close(); 
      } 

     } 
    } 

    cur.close(); 
    return data; 
} 

И вы можете оптимизировать этот код немного, имея это принести телефонные номера вместе с именами, как текущий путь займет изрядное немного времени, если данные огромна. Вы можете посмотреть этот пост: https://stackoverflow.com/a/28690030/3717990