Android - 光标 - 获取所有联系人,但错误的照片图片

问题描述:

我正在从Google帐户和手机中检索所有联系人。 我不明白为什么图片对某些人来说是正确的,对别人来说是错误的。Android - 光标 - 获取所有联系人,但错误的照片图片

非常感谢您的帮助。

这是我的代码,

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

我环路跨光标并做一些过滤器,以避免一些重复 的想法是收集在一个相同的联系人相同的联系人信息(对象)

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

基于此,我创建了一个对象在Viewholder中检索到的联系人

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

代码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

你是如何结合的结果有何看法? –

+0

我更新了我的问题以回答你的问题 – Isabelle

+0

也显示MyContactListViewHolder代码。 –

不要在onBindViewHolder方法使用findViewById。在MyContactListViewHolder(你已经在做)中做。

尝试下面的代码,

@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

就是这样!非常感谢。我不会忘记:) – Isabelle

+0

这个问题实际上出现在没有图片可用的情况下我正在显示的TextDrawable(带有名字的圆圈)。我注意到你删除了对它的引用,并且一切正常。所以我调查并解决了这个问题。再次感谢。 – Isabelle

+0

你需要在那里再次调用'setVisibility'吗? –