我正在使用recyclerview实施一项活动。我加载了手机中的所有联系人(姓名和电话号码)。一切看起来都不错,问题是当我在视图中进行滚动时,当我回到同一联系人时,此联系人没有正确的电话号码。是唯一一个改变。姓名和联系电话显示正确。Recyclerview在滚动视图时更改contactsContract中phoneNumber的值
例如,一个联系人只设置了手机。初始化时看起来没问题,但如果我滚动并回来,家庭和工作设置了另一个数字,并且此用户只有设置移动电话
一些帮助将apreciate!
这是我在recyclerAdapter onBind方法:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
dataCursor.moveToPosition(position);
holder.mTextView.setText((dataCursor.getString(1)));
ContentResolver cr = context.getContentResolver();
String contactId = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Contacts._ID));
Long photoTest = dataCursor.getLong(dataCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
if (dataCursor.moveToFirst()) {
Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
if (phones == null) {
phones.close();
} else {
while (phones.moveToNext()) {
try {
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{contactId}, null);
while (pCur.moveToNext()) {
int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if(phoneType == TYPE_MOBILE){
holder.mNumberMoBilePhone.setText(phoneNumber);
holder.mNumberMoBilePhone.setVisibility(View.VISIBLE);
holder.textMobilePhone.setVisibility(View.VISIBLE);
}else if(phoneType == TYPE_HOME){
holder.mNumberHomePhone.setText(phoneNumber);
holder.mNumberHomePhone.setVisibility(View.VISIBLE);
holder.textHomePhone.setVisibility(View.VISIBLE);
}else if(phoneType == TYPE_WORK){
holder.mNumberWorkPhone.setText(phoneNumber);
holder.mNumberWorkPhone.setVisibility(View.VISIBLE);
holder.textWorkPhone.setVisibility(View.VISIBLE);
}else{}
}
} catch (NullPointerException n) {
}
}
phones.close();
}
}
if (photoTest != null) {
ContactPhotoLoaderSdk5.instance().loadPhoto(holder.mContactPhoto, photoTest);
}
}
不知道是否必须与thit东西,但这是我的选择:
String select = "((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " != 0))";
我建议您在设置适配器时从数据库获取所有数据。将这些数据放入一个列表中并使用适配器中的列表。这样可以提高性能,使代码更清晰,并且更容易发现错误。 – Robbe