2016-10-09 36 views
0

我正在從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代碼。 –

回答

1

不要在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'嗎? –