2016-10-09 5 views
0

Ich erhalte alle Kontakte von Google-Konten und dem Telefon. Ich verstehe nicht, warum Bilder für einige richtig und für andere falsch sind.Android - Cursor - Erhalten aller Kontakte, aber auch falsche Foto-Bilder

Vielen Dank für jede Hilfe.

Dies ist mein Code,

List<AddressBookContact> list = new LinkedList<>(); 
LongSparseArray<AddressBookContact> array = new LongSparseArray<>(); 

String[] projection = { 
     ContactsContract.Data.MIMETYPE, 
     ContactsContract.Data.CONTACT_ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, 
     ContactsContract.CommonDataKinds.Contactables.DATA, 
     ContactsContract.CommonDataKinds.Contactables.TYPE, 
     ContactsContract.RawContacts.ACCOUNT_TYPE 
}; 
String selection = ContactsContract.Data.MIMETYPE + " in (?, ?)"; 
String[] selectionArgs = { 
     ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, 
     ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, 
}; 
String sortOrder = ContactsContract.Contacts.SORT_KEY_ALTERNATIVE; 

Uri uri = null; 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
    uri = ContactsContract.Data.CONTENT_URI; 
} 

assert uri != null; 
Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); 

assert cursor != null; 
final int idIdx = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); 
final int nameIdx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
final int picIdx = cursor.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI); 
final int dataIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Contactables.DATA); 
final int typeIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Contactables.TYPE); 
//final int typeDir = cursor.getColumnIndex(ContactsContract.Directory.ACCOUNT_TYPE); 

ich über die Cursor-Schleife und tun einige Filter einige Duplikate Die Idee zu vermeiden, ist die gleiche Kontaktinformationen unter einem gleichen Kontakt (Objekt)

zu sammeln
while (cursor.moveToNext()) { 
     long id = cursor.getLong(idIdx); 
     AddressBookContact addressBookContact = array.get(id); 
     //if(!cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)).equals("com.google")){ 

     //lastName = cursor.getString(nameIdx); 
     if(!lastName.toLowerCase().contains(cursor.getString(nameIdx).toLowerCase())){ 
      if(!cursor.getString(nameIdx).toLowerCase().contains("unsub") && !cursor.getString(nameIdx).toLowerCase().contains("noreply")) { 
       if (!StringUtils.isEmailValid(cursor.getString(nameIdx).toLowerCase())) { 

        lastName = cursor.getString(nameIdx); 

        if (addressBookContact == null) { 
         addressBookContact = new AddressBookContact(id, cursor.getString(nameIdx), context.getResources()); 
         addressBookContact.setImagepath(cursor.getString(picIdx)); 
         array.put(id, addressBookContact); 
         list.add(addressBookContact); 
         addressBookContact.setId(id); 
        } 

        int type = cursor.getInt(typeIdx); 
        String data = cursor.getString(dataIdx); 
        addressBookContact.addEmail(type, data); 

       } 
      } 
     } 
     else{ 
      if(addressBookContact != null){ 
       int type = cursor.getInt(typeIdx); 
       String data = cursor.getString(dataIdx); 
       addressBookContact.addEmail(type, data); 
      } 
     } 

     //} 

    } 

    cursor.close(); 

    return list; 
} 

auf dieser Basis erstelle ich ein Objekt Kontakt, die innerhalb eines Viewholder

abgerufen
@Override 
public void onBindViewHolder(MyContactListViewHolder holder, int position) { 
    String imagepath = mainInfo.get(position).getImagepath(); 

    if (imagepath != null && !imagepath.isEmpty()) { 
     ImageView imageView = (ImageView)holder.itemView.findViewById(R.id.imageview_contact_picture); 
     imageView.setImageURI(Uri.parse(imagepath)); 
    } 
    else{ 

     String firstLetter = mainInfo.get(position).getName().substring(0,1).toUpperCase(); 
     TextDrawable drawable = TextDrawable.builder() 
       .buildRound(firstLetter, 0xff3fbfe8); 

     ImageView image = (ImageView) holder.itemView.findViewById(R.id.imageview_contact_no_picture); 
     image.setVisibility(View.VISIBLE); 
     image.setImageDrawable(drawable); 
    } 

    holder.textViewShowName.setText(mainInfo.get(position).getName()); 
} 

-Code für MyContactListViewHolder

class MyContactListViewHolder extends RecyclerView.ViewHolder{ 

    ImageView imageViewUserImage; 
    TextView textViewShowName; 
    MyContactListViewHolder(View itemView) { 
     super(itemView); 

     textViewShowName = (TextView) itemView.findViewById(R.id.textview_contact_name); 
     imageViewUserImage = (ImageView) itemView.findViewById(R.id.imageview_contact_picture); 

     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MyBottomSheetDialogFragment bottomSheetDialogFragment = MyBottomSheetDialogFragment.newInstance(); 
       Bundle bundle = new Bundle(); 
       bundle.putParcelable("contact", mainInfo.get(getAdapterPosition())); 
       bottomSheetDialogFragment.setArguments(bundle); 
       bottomSheetDialogFragment.show(fragmentManager, null); 
      } 
     }); 
    } 
} 

@Override 
public MyContactListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_list_item, parent, false); 

    return new MyContactListViewHolder(v); 
} 
+0

Wie binden Sie die Ergebnisse auf die Ansicht? –

+0

Ich habe meine Frage aktualisiert, um Ihre Frage zu beantworten. – Isabelle

+0

Zeigen Sie auch den 'MyContactListViewHolder'-Code an. –

Antwort

1

Verwenden findViewById nicht in der onBindViewHolder Methode. Tun Sie es in MyContactListViewHolder (was Sie bereits tun).

Versuchen Sie den folgenden Code,

@Override 
public void onBindViewHolder(MyContactListViewHolder holder, int position) { 
    String imagepath = mainInfo.get(position).getImagepath(); 

    if (imagepath != null && !imagepath.isEmpty()) { 
     holder.imageViewUserImage.setImageURI(Uri.parse(imagepath)); 
    } else{ 

     String firstLetter = mainInfo.get(position).getName().substring(0,1).toUpperCase(); 
     TextDrawable drawable = TextDrawable.builder().buildRound(firstLetter, 0xff3fbfe8); 

     holder.imageViewUserImage.setVisibility(View.VISIBLE); 
     holder.imageViewUserImage.setImageDrawable(drawable); 
    } 

    holder.textViewShowName.setText(mainInfo.get(position).getName()); 
} 
+1

Das war es! Ich danke dir sehr. Ich werde das nicht vergessen :) – Isabelle

+0

Das Problem war in der Tat in der TextDrawable (Kreis mit Vorname Brief), die ich im Falle eines fehlenden Bildes angezeigt wurde. Ich habe bemerkt, dass Sie die Referenz entfernt haben und alles hat gut funktioniert. Also habe ich das Problem untersucht und behoben. Danke noch einmal. – Isabelle

+0

Müssen Sie da 'setVisibility' erneut aufrufen? –